RabbitMQ基本介绍
官网:http://www.rabbitmq.com/getstarted.html
1 安装与配置
由于RabbitMQ是用Erlang语言编写的,必须要先安装Erlang环境。
Erlang和RabbitMQ版本有对应关系:https://www.rabbitmq.com/which-erlang.html
1.1 window
- 下载安装Erlang 23.1:https://www.erlang.org/downloads/23.1,exe一路next就可以
- 配置Erlang环境变量
- 下载安装RabbitMQ 3.8.9:http://www.rabbitmq.com/install-windows.html
- 配置RabbitMQ环境变量
- 启用RabbitMQ管理插件:
1 | |
- 启动RabbitMQ
1 | |
- 关闭RabbitMQ
1 | |
访问管理界面:http://localhost:15672/
默认用户名:guest
默认密码为:guest
1.2 linux
- 安装Erlang 21.3
1 | |
- 安装RabbitMQ 3.8.4
1 | |
- 启动RabbitMQ
1 | |
- 添加新用户
1 | |
- 启用管理插件
1 | |
- 访问:http://虚拟机IP:15672
2 核心概念

2.1 Producer
生产者,就是投递消息的一方。生产者创建消息,然后发布到 RabbitMQ 中。
消息一般可以包含两个部分:消息体和附加信息。
- 消息体(payload) 在实际应用中,消息体一般是一个带有业务逻辑结构的数据,比如一个JSON字符串。当然可以进 一步对这个消息体进行序列化操作。
- 附加信息 用来表述这条消息,比如目标交换器的名称、路由键和一些自定义属性等等。
2.2 Broker
消息中间件的服务节点 。对于RabbitMQ来说, 一个RabbitMQ Broker可以简单地看作一个RabbitMQ服务节点,或者 RabbitMQ服务实例。也可以将一个RabbitMQ Broker看作一台 RabbitMQ服务器。
2.3 Connection
无论是生产者发送消息,还是消费者接收消息,都必须要跟Broker之间建立一个连接,这个连接是一个TCP的长连接。
2.4 Channel
频道或信道,是建立在Connection连接之上的一种轻量级的连接。
大部分的操作是在Channel这个接口中完成的,包括定义队列的声明queueDeclare、交换机的声明 exchangeDeclare、队列的绑定queueBind、发布消息basicPublish、消费消息basicConsume等。
如果把Connection比作一条光纤电缆的话,那么Channel信道就比作成光纤电缆中的其中一束光纤。一个 Connection上可以创建任意数量的Channel。
2.5 Queue
队列,是RabbitMQ的内部对象,用于存储消息。
2.6 Consumer
消费者消费消息有两种模式:
一种是Pull模式,对应的方法是basicGet。消息存放在服务端,只有消费者主动获取才能拿到消息。如果每个一段时间获取一次消息,消息的实时性会降低。但是好处是可以根据自己的消费能力决定获取消息的频率。
另一种是Push模式,对应的方法是basicConsume,只要生产者发消息到服务器,就马上推送给消费者,消息保存在客户端,实时性很高,如果消费不过来可能会造成消息积压。Spring AMQP是push方式,通过事件机制对队列进行监听,只要有消息到队列,就会触发消费消息的方法。
RabbitMQ中pull和push都有实现。kafka和RocketMQ只有pull。
由于队列FIFO的特性,只有确定前一条消息被消费者接收之后,Broker才会把这条消息从数据库删除,继续投递下一条消息。
一个消费者是可以监听多个队列的,一个队列也可以被多个消费者监听。但是在生产环境中,一般建议一个消费者只处理一个队列的雄安锡。如果需要提升处理消息的能力,可以增加多个消费者。这个时候消息会在多个消费者之间轮询。
2.7 Exchange
交换器,生产者将消息发送到 Exchange (交换器,通常也可以用大写的“X”来表示), 由交换器将消息路由到一个或者多个队列中。如果路由不到,或返回给生产者,或直接丢弃。
RabbitMQ中一共有四种类型的交换机,Direct、Topic、Fanout、Headers。其中Headers不常用。交换机的类型可以在创建的时候指定,网页或者代码中。
2.7.1 Direct-直连
一个队列与直连类型的交换机绑定,需指定一个明确的绑定键(binding key)。生产者发送给消息时会携带一个路由键(routing key)。当消息的路由键与某个队列的绑定键完全匹配时,这条消息才会从交换机路由到这个队列上。多个队列也可以使用相同的绑定键。

直连类型的交换机,适用于一些业务用途明确的消息。比如HR系统中销售系统之间通信,传输时销售系统专用的消息,就可以建一个直连类型的交换机,使用明确的绑定键。
2.7.2 Topic-主题
一个队列与主题类型的交换机绑定时,可以在绑定键中使用通配符。支持两个通配符:
#代表0个或者多个单词
*代表只有一个单词
单词(word)指的是用英文的点“.”隔开的字符。例如a.bc.def是3个单词。

主题路由的交换机适用于一些根据业务主题或者消息等级过滤消息的场景,比如说一条消息可能既跟资金有关,又跟风控有关,那就可以让这个消息指定一个多级的路由键。第一个单词代表和资金有关,第二个单词代表和风控有关。下游的业务系统的队列就可以使用不同的绑定键去接收消息了。
2.7.3 Fanout-广播
广播类型的交换机与队列绑定时,不需要指定绑定键。因此生产者发送消息到广播类型交换机上,也不需要携带路由键。消息到达交换机时,所有与之绑定了的队列,都会收到相同消息的副本。
广播类型的消息适用于一些通用的业务消息。比如产品系统产品数据变化的消息,是所有的系统都会用到的,就可以创建一个广播类型的交换机,大家自己建队列就绑定就ok了。
2.7.4 headers-头交换机(不常用)
不依赖于路由键的匹配规则来路由消息,而是根据发送的消息内容中的 headers 属性进行匹配。headers 类型的交换器性能很差,而且也不实用。
2.8 Vhost
虚拟主机,表示一批交换器、消息队列和相关对象。 虚拟主机是共享相同的身份认证和加密环境的独立服务器域。每个 vhost 本质上就是一个 mini 版的 RabbitMQ 服务器,拥有自己的队列、交换器、绑定和权限机制。 vhost 是 AMQP 概念的基础,必须在连接时指定,RabbitMQ 默认的vhost是 / 。Vhost除了可以提高硬件资源的利用率之外,还可以实现资源的隔离和权限的控制。
2.9 RoutingKey
路由键。生产者将消息发给交换器的时候,一般会指定一个 RoutingKey,用来指定这个消息的路由规则。
RoutingKey需要与交换器类型和绑定键 (BindingKey) 联合使用 在交换器类型和绑定键 (BindingKey) 固定的情况下,生产者可以在发送消息给交换器时,通过指定 RoutingKey 来决定消息流向哪里。
2.10 Binding
绑定,RabbitMQ 中通过绑定将交换器与队列关联起来,在绑定的时候一般会指定一个绑定键 ( BindingKey ) ,这样 RabbitMQ 就知道如何正确地将消息路由到队列了。
3 工作流程

3.1 生产者发送消息的过程
- 生产者连接到 RabbitMQ Broker,建立一个连接( Connection) ,开启一个信道 (Channel)
- 生产者声明一个交换器 ,并设置相关属性,比如交换机类型、是否持久化等
- 生产者声明一个队列井设置相关属性,比如是否排他、是否持久化、是否自动删除等
- 生产者通过路由键将交换器和队列绑定起来
- 生产者发送消息至RabbitMQ Broker,其中包含路由键、交换器等信息
- 相应的交换器根据接收到的路由键查找相匹配的队列
- 如果找到,则将从生产者发送过来的消息存入相应的队列中
- 如果没有找到,则根据生产者配置的属性选择丢弃还是回退给生产者
- 关闭信道、关闭连接
3.2 消费者接收消息的过程
- 生产者连接到RabbitMQ Broker,建立一个连接( Connection) ,开启一个信道 (Channel)
- 消费者向RabbitMQ Broker 请求消费相应队列中的消息,可能会设置相应的回调函数,以及做一些准备工作
- 等待RabbitMQ Broker 回应并投递相应队列中的消息, 消费者接收消息
- 消费者确认 (ack) 接收到的消息
- RabbitMQ 从队列中删除相应己经被确认的消息
- 关闭信道、关闭连接