RabbitMQ 基础
- RabbitMQ 基本介绍
- RabbitMQ 基本概念
- Connection
- Channel
- Virtual Host
- Queue
- Exchange
- direct
- fanout
- topic
- headers
RabbitMQ 基本介绍
RabbitMQ 是使用 Erlang 语言开发的基于 AMQP 协议来实现的开源消息队列系统。
RabbitMQ 的特点:
-
灵活路由:Exchange 交换机提供多种模式路由消息;
-
可靠性:采用多种机制保证数据不丢失;
-
高可用性:队列可以在集群中的机器上设置镜像,使得在部分节点出现问题的情况下队列仍然可用;
-
可扩展性:多个RabbitMQ 节点可以组成一个集群,也可以根据实际业务情况动态地扩展集群中节点;
-
多协议支持:RabbitMQ 除了原生支持 AMQP 协议,还支持 STOMP、MQTT 等多种消息中间件协议;
-
多语言客户端:RabitMQ 几乎支持所有常用语言,比如 Java、Python 、Ruby 、PHP 、C# 、JavaScript 等;
-
管理界面:RabbitMQ 提供了一个易用的用户界面,使得用户可以监控和管理消息、集群中的节点等;
-
插件机制:RabbitMQ 提供了许多插件, 以实现从多方面进行扩展;
RabbitMQ 基本概念
RabbitMQ 的主要核心概念包括 Connection、Channel、Exchange、Queue、Virtua Host。
Connection
Connection 即连接,生产者与消费者进行消息的生产与消费都需要与 RabbitMQ 建立连接,Connection 是一个 TCP 的长连接。
Channel
Channel 是在 Connection 连接的基础上建立的虚拟连接,其目的是为了节省资源。因为建立 Connection TCP 连接的开销较大,若每次与 RabbitMQ 进行通信都建立 Connection 的话,对资源的需求量较大。
因此,引入 Channel 来解决上述问题,当主程序已经建立好 Connection 后,程序中的多个线程就可以通过 Channel 与 RabbitMQ 建立通信,每个 Channel 都拥有自己的 Channel id,各个 Channel 之间相互隔离。
RabbitMQ 中大部分的操作都是由 Channel 完成的,如声明 Exchange、声明 Queue、发布消息、接收消息等…
Virtual Host
Virual Host 即虚拟主机。在 Broker 中可以存在多个 Virtual Host,每个 Virtual Host 都拥有自己的一套 Exchange 以及 Queue,各 Virtual Host 之间互相隔离。因此,虚拟主机实现了不同用户之间的隔离。
在同一个 Virtual Host 中,Exchange 与 Queue 不能重名;但是在不同 Virtual Host 中,Exchange 与 Queue 可以同名。
Queue
Queue 即存放消息的队列,生产者将生产的消息存放在 Queue,等待消费者接收消息并进行消费。
Exchange
Exchange 是交换机,它是消息到达 RabbitMQ 的第一站。Exchange 可以理解成一个路由器,其根据用户制定好的路由分发规则,将消息转发放入对应的 Queue 消息队列。
Exchange 有 4 中路由分发规则:direct、fanout、topic 以及 headers。其分发规则都是基于 Routing Key 与 Binding Key 实现的。当生产者向 RabbitMQ 发送一条消息时,必须指定相应的 Routing Key,消息携带该 Key 到达 RabbitMQ 之后,Exchange 根据指定的路由规则对 Routing Key 进行解析并与绑定的 Queue 的 Binding Key 相比较,然后将消息分发到对应的 Queue 当中。
下面分别介绍一下 Exchange 的四种分发规则。
direct
direct 规则为精确匹配,即当消息携带的 Routing Key 与 Binding Key 完全相同时,消息才会被分发到对应的 Queue。
direct 模式示例:
创建交换机 My_Direct_Exchange 并设置规则为 direct,创建两个 Queue,与 Exchange 绑定,绑定时设置 Routing Key 分别为 Queue01 和 Queue02
指定 Routing Key 为 Queue01,发送消息
进入对应的 My_Direct_Queue01,获取消息
fanout
fanout 类型为广播类型,即 Exchange 会将接收到的信息分发到全部与之绑定的 Queue。
fanout 模式示例:
创建交换机 My_Fanout_Exchange 并设置规则为 fanout,创建两个 Queue,与 Exchange 绑定,绑定时设置 Routing Key 分别为 Queue01 和 Queue02
指定 Routing Key 为任意值,发送消息
查看指定的队列,所有与之绑定的队列均可以收到消息
topic
topic 类型会根据通配符对 Routing Key 进行匹配,通配符的匹配规则如下:
-
Routing Key 必须为一串字符串,每个单词之间使用
.
分隔; -
#
表示匹配一个或者多个单词; -
*
表示匹配一个单词;
topic 模式示例:
创建交换机 My_Topic_Exchange 并设置规则为 topic,创建两个 Queue,与 Exchange 绑定,绑定时设置 Routing Key 如下所示:
分别指定 Routing Key 为test.testTopic
和test.my.testTopic
,发送消息,查看对应的 Queue。可以看到,根据分发规则,Queue01 只收到了一条消息,而 Queue02 则是收到了全部两条消息
headers
headers 类型在日常工作中并不经常使用,该模式下 Exchange 与 Queue 的绑定不再通过 Routing Key 实现,而是通过 Arguments 进行绑定。
当生产者发送消息时,会在消息的 Headers 中携带相应的属性,若消息携带的属性将 Arguments 全部包含在内,则将消息转发至对应的 Queue。
headers 模式示例:
创建交换机 My_Topic_Exchange 并设置规则为 topic,创建三个 Queue,与 Exchange 绑定,绑定时设置 Arguments 如下所示:
在发送消息时分别指定 Headers 为x=1
以及x=1, y=2
,发送消息。查看 Queue,可以发现:Queue01 接收到了两条消息;而 02 以及 03 仅接收到了一条消息,即x=1, y=2
的消息。