RabbitMQ系列-概念及安装
1. 消息队列
消息队列是指利用队列这种数据结构进行消息发送、缓存、接收,使得进程间能相互通信,是点对点的通信
而消息代理是对消息队列的扩展,支持对消息的路由,是发布-订阅模式的通信,消息的发送者并不清楚消息的接收者,消息可以被多个消费者接收。
使用消息队列的作用如下
异步:对于一些用户的请求,可能包含一些发送短信,发送邮件等系统处理,此时可以不需要等待短息发送完成或者邮件发送完成,而是通过消息队列通知这些模块即可返回,避免用户长时间等待
解耦:将数据发送到消息队列,对该数据感兴趣的系统自行订阅该消息即可,这种做法可以降低代码的耦合度。
消峰填谷:将瞬时高并发请求打到消息队队列上,作为数据库请求的缓冲,避免短时间大量的数据库请求导致数据库奔溃。
2. RabbitMQ简介
RabbitMQ是一种开源的多协议消息代理软件,它将消息发布者(发布消息的应用程序,也称为生产者)接收消息并将它们路由到消费者(处理消息的应用程序)。
RabbitMQ支持多种消息传递协议,其中AMQP 0-9-1是核心,并以插件的形式支持STOM,MQTT,AMQP 1.0。
AMQP,即Advanced Message Queuing Protocol,中文名称是高级消息传递协议。
AMQP 0-9-1 模型如下图所示

消息生产者producer和消费者consumer均通过TCP连接消息代理broker,生产者producer将消息投递到交换机exchange,消息代理根据消息队列queue和交换机exchange的绑定关系bind将消息推送到对应的消息队列queue,最后消费者consumer消费感兴趣消息队列中的数据。
2.1 RabbitMQ中的相关概念
Producer:消息生产者
Consumer:消息消费者
Broker:消息代理,这里指即RabbitMQ,通过消息代理可以将消息从生产者投递到消费者
Virtual host:虚拟主机,使单个消息代理能提供了多个相对隔离的环境,隔离的资源包括交换机、队列等
Exchange:交换机,作用相当于现实生活的快递公司,生产者的消息实际时先投递到交换机,交换机再根据类型和绑定关系拷贝消息副本到指定队列,交换机的类型有direct, topic, headers and fanout
Queue: 队列,先进先出的优先级队列,充当了一个缓冲区的角色,作用相当于现实生活中的菜鸟驿站等代收点
Binding:交换机和队列的绑定关系,交换机投递消息到指定队列的规则,作用相当于现实生活中寄快递时填写的地址
Connection: 消息生产者和消费者通过TCP连接到虚拟主机,确保数据传输到可靠性
Channel:共享单个TCP连接的轻量级的Connection,不同Channel通过Channel ID隔离开,互不影响,通常一个进程可以只建立一个TCP连接,减少TCP的资源开销
2.2 RabbitMQ特性
可靠性(Reliablity):使用TCP连接进行数据传输、且提供了消息持久化、队列持久化、生产者发送确认、消费者消费确认等机制保证消息的可靠
灵活的路由(Flexible Routing):提供了多种类型的交换机Exchange
消息集群(Clustering):多个RabbitMQ服务器可以组成一个集群,形成一个逻辑消息代理Broker
高可用(Highly Avaliable Queues):队列可以在集群中的机器上进行镜像,使得在部分节点出问题的情况下队列仍然可用
多种协议(Multi-protocol):支持多种消息队列协议,核心是AMQP,通过插件形式支持STOMP、MQTT等
多种语言客户端(Many Clients):几乎支持所有常用语言,比如Java、Python、Golang等
管理界面(Management UI):提供了易用的用户界面,使得用户可以监控和管理消息Broker的许多方面
跟踪机制(Tracing):如果消息异常,RabbitMQ提供了消息的跟踪机制,使用者可以找出发生了什么
插件机制(Plugin System):提供了许多插件,来从多方面进行扩展,也可以编辑自己的插件
3. RabbitMQ安装
3.1 安装Docker
参考Install Docker Desktop on Mac安装docker,安装完成后点击Docker图标以启动Docker服务
这里简单介绍几个常用的docker命令
docker ps -a可以看到Docker启动过的容器
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8918b9e8bae2 rabbitmq:3-management "docker-entrypoint.s…" 2 days ago Up 2 days 4369/tcp, 5671/tcp, 0.0.0.0:5672->5672/tcp, 15671/tcp, 15691-15692/tcp, 25672/tcp, 0.0.0.0:15672->15672/tcp some-rabbit
docker stop CONTAINER ID停止运行中的容器
$ docker stop 8918b9e8bae2
8918b9e8bae2
docker restart CONTAINER ID重启容器
$ docker restart 8918b9e8bae2
8918b9e8bae2
docker exec -it CONTAINER ID /bin/bash 可以进入运行容器的终端
$ docker exec -it 8918b9e8bae2 /bin/bash
root@my-rabbit:/#
3.2 RabbitMQ安装及启动
打开终端,在终端中输入
docker run -d --hostname my-rabbit --name some-rabbit -p 15672:15672 -p 5672:5672 rabbitmq:3-management
通过http://localhost:15672可以访问管理后台,默认账号和密码均是guest
5672是AMQP 0-9-1 使用的端口
4. 管理后台
管理后台提供了监控和管理RabbitMQ节点和集群的能力。
管理后台如下图所示

通过该管理后台,可以查看当前活跃的Connection, Channel, Exchange, Queue等信息,从图片可以看出当前活跃的Exchange共有7个,具体的类型覆盖了direct, topic, headers and fanout四种。
通过这个管理后台也可以创建或者删除Connection, Channel, Exchange, Queue
RabbitMQ系列-概念及安装的更多相关文章
- 快速掌握RabbitMQ(一)——RabbitMQ的基本概念、安装和C#驱动
1 RabbitMQ简介 RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现,官网地址:http://www.rabbitmq.com.Ra ...
- RabbitMQ系列随笔——介绍及安装
一.RabbitMQ介绍 RabbitMQ是由erlang开发的AMQP(Advanced Message Queuing Protocol)的开源实现.他是高级消息队列协议,是应用层协议的一个开放标 ...
- RabbitMQ系列(二)深入了解RabbitMQ工作原理及简单使用
深入了解RabbitMQ工作原理及简单使用 RabbitMQ系列文章 RabbitMQ在Ubuntu上的环境搭建 深入了解RabbitMQ工作原理及简单使用 RabbitMQ交换器Exchange介绍 ...
- RabbitMQ基本概念和使用
RabbitMQ是一个消息代理,核心原理:发送消息,接收消息. RabbitMQ主要用于组件之间的解耦,消息发送者无需知道消息使用者的存在,反之亦然. 单向解耦 ...
- Redis系列(1)之安装
Redis系列(1)之安装 由于项目的需要,最近需要研究下Redis.Redis是个很轻量级的NoSql内存数据库,它有多轻量级的呢,用C写的,源码只有3万行,空的数据库只占1M内存.它的功能很丰富, ...
- 在Node.js中使用RabbitMQ系列二 任务队列
在上一篇文章在Node.js中使用RabbitMQ系列一 Hello world我有使用一个任务队列,不过当时的场景是将消息发送给一个消费者,本篇文章我将讨论有多个消费者的场景. 其实,任务队列最核心 ...
- RabbitMQ基本概念和原理
RabbitMQ基本概念和原理 1.AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计. 2.Rabb ...
- RabbitMQ系列教程之五:主题(Topic)(转载)
RabbitMQ系列教程之五:主题(Topic) (本实例都是使用的Net的客户端,使用C#编写),说明,中文方括号[]表示名词. 在上一个教程中,我们改进了我们的日志记录系统. 没有使用只能够进行虚 ...
- RabbitMQ系列教程之三:发布/订阅(Publish/Subscribe)(转载)
RabbitMQ系列教程之三:发布/订阅(Publish/Subscribe) (本教程是使用Net客户端,也就是针对微软技术平台的) 在前一个教程中,我们创建了一个工作队列.工作队列背后的假设是每个 ...
- RabbitMQ系列教程之二:工作队列(Work Queues)(转载)
RabbitMQ系列教程之二:工作队列(Work Queues) 今天开始RabbitMQ教程的第二讲,废话不多说,直接进入话题. (使用.NET 客户端 进行事例演示) ...
随机推荐
- Python学习笔记--数据可视化的开头
JSON数据格式的转换 示例: 若是有中文数据,可以在data后面加上ensure_ascii=False pyecharts模块 网站:https://gallery.pyecharts.org(有 ...
- JavaWeb学习笔记第三弹
一.数据库设计 1.软件研发步骤 2.数据库设计概念 建立数据库中的表结构以及表与表之间的关联关系的过程 3.数据库设计的步骤 表关系:一对一.一对多(多对一).多对多 表关系之一对多 表关系之多对多 ...
- CF859E题解
题意简述 翻译很清楚了 题目解法 如果一个人想去的位置上原来坐着人,那么他要坐到这个位置上,就要把原来的人赶走. 原来的人被赶走了,就只能去想去的位置.如果那个位置上有人,又要把那个人赶走. 我们发现 ...
- Kotlin 与 JAVA 不同之处
添加kotlin混编支持 要在Android项目中添加Kotlin混编支持,需要进行以下步骤: 在项目的 build.gradle 文件中添加以下代码: kotlin android { ... // ...
- WebSocket服务器
//创建websocket 服务器 ws_server.php //https://wiki.swoole.com/wiki/page/479.html //创建websocket服务器对象,监听0 ...
- vue中新的状态管理器-pinia
背景 对于pinia的使用,可参考官方文档在这不做过多赘述.这边主要来讲讲pinia中 少用且好用的方法,为什么我们选择pinia而不用vuex ps: 以下写法全部基于组合式API 使用方式: 先下 ...
- 【Vue项目】尚品汇(三)Home模块+Floor模块+Swiper轮播图
写在前面 今天是7.23,这一篇内容主要完成了Home模块和部分Search模块的开发,主要是使用了swiper轮播图插件获取vuex仓库数据展示组件以及其他信息. 1 Search模块 1.1 Se ...
- 【Spring5】框架新功能
Spring5框架新功能 整个Spring5框架的代码基于Java8,运行时兼容JDK9,许多不建议使用的类和方法在代码库中删除. Spring5自带了通用的日志封装:log4j2 已经移除了log4 ...
- TiDB与MySQL的SQL差异及执行计划简析
作者:京东零售 肖勇 一. 前言导读 TiDB作为NewSQL,其在对MySQL(SQL92协议)的兼容上做了很多,MySQL作为当下使用较广的事务型数据库,在IT界尤其是互联网间使用广泛,那么对于开 ...
- Kubernetes入门实践(环境搭建)
容器技术只是解决了运维部署工作中的一个很小的问题,在现实生产环境中,除了最基本的安装,还会各式各样的需求,比如服务发现.负载均衡.状态监控.健康检查.扩容缩容.应用迁移.高可用等等.这些容器之上的管理 ...