核心概念
Connection
Connection是RabbitMQ内部对象之一,用于管理每个到RabbitMQ的TCP网络连接。
Producer与Consumer
生产者与消费者相对于RabbitMQ服务器来说,都是RabbitMQ服务器的客户端。
生产者(Producer):连到RabbitMQ服务器,将消息发送到RabbitMQ服务器的队列,是消息的发送方。
消费者(Consumer):连接到RabbitMQ则是为了消费队列中的消息,是消息的接收方。
生产者与消费者一般由我们的应用程序充当。
Channel
Channel是我们与RabbitMQ打交道的最重要的一个接口,我们大部分的业务操作是在Channel这个接口中完成的,包括定义Queue、定义Exchange、绑定Queue与Exchange、发布消息等
Exchnage
消息交换机,作用是接收来自生产者的消息,并根据路由键转发消息到所绑定的队列。
生产者发送上的消息,就是先通过Exchnage按照绑定(binding)规则转发到队列的。
交换机类型(Exchange Type)有四种:fanout、direct、topic,headers,其中headers并不常用。
fanout:这种类型不处理路由键(RoutingKey),很像子网广播,每台子网内的主机都获得了一份复制的消息,发布/订阅模式就是指使用fanout交换机类型,fanout类型交换机转发消息是最快的。
direct:模式处理路由键,需要路由键完全匹配的队列才能收到消息,路由模式使用的是direct类型的交换机。
topic:将路由键和某模式进行匹配。主题模式使用的是topic类型的交换机。
路由模式,发布订阅模式,主题模式,这些工作模式我们下面会讲。
Queue
Queue,即队列,RabbitMQ内部用于存储消息的对象,是真正用存储消息的结构,在生产端,生产者的消息最终发送到指定队列,而消费者也是通过订阅某个队列,达到获取消息的目的。
RoutingKey(路由键)
用于把生成者的数据分配到交换器上;
BindingKey(绑定键)
用于把交换器的消息绑定到队列上;
Virtual Host
Virutal host也叫虚拟主机,一个VirtualHost下面有一组不同Exchnage与Queue,不同的Virtual host的Exchnage与Queue之间互相不影响。
应用隔离与权限划分,Virtual host是RabbitMQ中最小颗粒的权限单位划分。
如果要类比的话,我们可以把Virtual host比作MySQL中的数据库,通常我们在使用MySQL时,会为不同的项目指定不同的数据库,同样的,在使用RabbitMQ时,我们可以为不同的应用程序指定不同的Virtual host。
消息传递过程
首先客户端必须连接到 RabbitMQ 服务器才能发布和消费消息,客户端和 rabbit server 之间会创建一个 tcp 连接,一旦 tcp 打开并通过了认证(认证就是你发送给 rabbit 服务器的用户名和密码),你的客户端和 RabbitMQ 就创建了一条 amqp 信道(channel),信道是创建在“真实” tcp 上的虚拟连接,amqp 命令都是通过信道发送出去的,每个信道都会有一个唯一的 id,不论是发布消息,订阅队列都是通过这个信道完成的。
为什么不直接通过TCP协议?
因为其代价高昂,如果有成千上万个请求,是否要建立成千上万个TCP连接?
发送消息
- 生产者和Broker建立TCP连接。
- 生产者和Broker建立通道。
- 生产者通过通道消息发送给Broker,由Exchange将消息进行转发。
- Exchange将消息转发到指定的Queue(队列)
接受消息
- 消费者和Broker建立TCP连接
- 消费者和Broker建立通道
- 消费者监听指定的Queue(队列)
- 当有消息到达Queue时Broker默认将消息推送给消费者。
工作模式
简单(simple)模式
simple模式,是RabbitMQ几种模式中最简单的一种模式,其结构如下图所示:
从上面的示意图,我们可以看出simple模式有以下几个特征:
- 只有一个生产者、一个消费者和一个队列。
- 生产者和消费者在发送和接收消息时,只需要指定队列名,而不需要指定发送到哪个Exchange,RabbitMQ服务器会自动使用Virtual host的默认的Exchange,默认Exchange的type为direct。
工作(work)模式
在simple模式下只有一个生产者和消费者,当生产者生产消息的速度大于消费者的消费速度时,我们可以添加一个或多个消费者来加快消费速度,这种在simple模式下增加消费者的模式,称为work模式,如下图所示:
work模式有以下两个特征:
- 可以有多个消费者,但一条消息只能被一个消费者获取。
- 发送到队列中的消息,由服务器平均分配给不同消费者进行消费。
发布/订阅(pub/sub)模式
work模式可以将消息转到多个消费者,但每条消息只能由一个消费者获取,如果我们想一条消息可以同时给多个消费者消费呢?
这时候就需要发布/订阅模式,其示意图如下所示:
从上面的示意图我们可以看出来,在发布/订阅模式下,需要指定发送到哪个Exchange中,上面图中的X表示Exchange。
发布/订阅模式中,Echange的type为fanout。- 生产者发送消息时,不需要指定具体的队列名,Exchange会将收到的消息转发到所绑定的队列。
- 消息被Exchange转到多个队列,一条消息可以被多个消费者获取。
路由(routing)模式
前面几种模式,消息的目标队列无法由生产者指定,而在路由模式下,消息的目标队列,可以由生产者指定,其示意图如下所示:
从上面示意图,我们可以看出路由模式有以下特征:
路由模式下Exchange的type为direct。
消息的目标队列可以由生产者按照routingKey规则指定。
一条消息队可以被多个消息者获取。只有RoutingKey与BidingKey相匹配的队列才会收到消息。
RoutingKey用于生产者指定Exchange最终将消息路由到哪个队列,BindingKey用于消费者绑定到某个队列。
主题(topic)模式
主题模式是在路由模式的基础上,将路由键和某模式进行匹配。其中#表示匹配多个词,*表示匹配一个词,消费者可以通过某种模式的BindKey来达到订阅某个主题消息的目的,如示意图如下所示:
- 主题模式Exchange的type取值为topic。
- 一条消息可以被多个消费者获取。