1. 生产者
用于创建消息,并发布到Rabbit服务器
2. 消息
包含两部分,有效载荷(payload)和标签(label)
有效载荷(payload):传输过程中的数据,可以是JSON,图片等
标签(label):描述有效载荷,Rabbit会根据标签把消息发送给接收方

3. 消费者
连接到Rabbit服务器,并订阅到队列(queue)上,当消费者接受到消息时,只得到消息的有效载荷(payload)。
RabbitMQ不会告诉消费者是谁生产/发送的消息。
如果想要知道是谁生产/发送的消息,除非生产者把这些信息写在有效载荷(payload)里
4. AMQP 信道
当 应用程序 和 Rabbit 代服务器建立 TCP 连接时,应用程序就可以创建一条AMQP信道。AMQP是建立在真实TCP连接中的虚拟连接。AMQP命令都是通过信道发送出去的。每条信道都会有一个ID(AMQP会记住它)。不论发布消息,订阅消息,或是接受消息,都通过信道完成。
5. 队列
AMQP 消息路由需要3个部分:交换器、队列、绑定。
生产者把消息发不到交换器上;消息最终到达队列,并被消费者接受;绑定决定了消息如何从路由器路由到队列。
消费者通过2种方式从特定的队列中接受消息:
- (1)通过AMQP的basic.consume命令订阅。这样做会讲信道置为接受模式,知道取消队列的订阅为止。
- (2)通过AMQP的basic.get命令,这样做可以让消费者只接受一条消息。
如果消息达到了无人订阅的队列,消息会在队列中一直等待,一旦有消费者订阅到该队列,队列上的消息就会发送给消费者。
当队列拥有多个消费者是,队列收到的消息将以循环(round-robin)的方式发送给消费者。每条消息只会发送给一个订阅的消费者。
假设:有seed_bin队列,消费者Bob和消费者Esmeralda订阅到seed_bin队列。当消息到达seed_bin队列时,消息投递方式如下:
- 消息 Message_A 到达 seed_bin队列
- RabbitMQ 把消息 Message_A 发送给 Bob
- Bob 确认接受到了消息 Message_A
- Rabbit 把消息 Message_A 从 seed_bin 中删除
- 消息 Message_B 到达 seed_bin 队列
- RabbitMQ 把消息 Message_B 发送给 Esmeralda
- Esmeralda 确认接受到了消息 Message_B
- RabbitMQ 把消息 Message_B 从 seed_bin 中删除
需要记住的是,消费者对消息的确认和告诉生产者消息已经接收了这两件事毫不相干
如果消费者收到一条消息,然后确认值钱从 Rabbit 断开连接(或者从队列上取消订阅),RabbitMQ会认为这条消息没有分发,然后重新分发给下一位订阅的消费者。另一方面,如果应用程序有 bug 而忘记确认消息的话,Rabbit 将不会给该消费者发送更多消息。这是因为在上一条消息被确认之前,Rabbit 认为这个消费者没有准备好接受下一条消息。
队列是AMQP消息通信的基础模块:
- 为消息提供了处所,消息在此等候消费
- 对负载均衡来说,队列是绝佳方案。只需附加一堆消费者,并让 RabbitMQ 以循环方式均匀的分配发来的消息
- 队列是 Rabbit 中消息的最后的终点(除非消息进入了黑洞)
6 联合起来:交换器和绑定
当想要将消息投递到队列时,你通过把消息发送给交换器来完成。然后,根据确定的规则,RabbitMQ 将会决定消息该投递到那个队列。这些规则被称作路邮件(routing key)。队列通过路由键绑定到交换器。当你把消息发送到代理服务器时,消息将拥有一个路由键--即便是空的--RabbitMQ 也会将其和绑定使用的路由键进行匹配。如果匹配成功,消息将会投递到该队列。否则,进入“黑洞”。
交换器一共有4种:direct、fanout、topic 和 headers
-
direct 交换器:如果路由键匹配的话,消息就被投递到对应的队列,如图
direct交换器.png
-
fanout 交换器:将收到的消息广播到绑定的队列上,如图
fanout交换器.png
-
topic交换器: 路由键设定匹配通用字符,比如"#" ,"*"这类,只要匹配路由键,就将消息投递到对应队列,如图
topci交换器.png
7 多租户模式:虚拟主机和隔离
每个 RabbitMQ 服务器都能创建虚拟消息服务器,我们称之为虚拟主机(vhost)。每个 vhost 本质上是一个 mini 版的 RabbitMQ 服务器,拥有自己的队列、交换器和绑定....更重要的是,它拥有自己的权限机制。这使得你能够安全地使用一个 RabbitMQ 服务器来服务众多应用程序,而不必担心你的Sudoku(数独)应用可能删除狗狗防丢跟踪器正在使用的队列。
RabbitMQ 包含来默认 vhost:“/”,因此使用起来非常简单。AMQP 没有指定权限控制是在 vhost 级别还是在服务器端级别实现。这留给来服务器的开发者去决定。在 RabbitMQ 的例子中,权限控制是以 vhost 为单位的。
vhost 之间是绝对隔离的。你无法将 vhost banana tree 上的交换器绑定到 vhost oak_tree 中的队列上。
当你在 RabbitMQ 集群上创建 vhost 是,整个集群上都会创建该 vhost。
vhost 和权限控制非常独特,它们是 AMQP 中唯一无法通过 AMQP 协议创建的基元(不同于队列、交换器和绑定)。需要通过 RabbitMQ 的安装路径下 ./sbin/ 目录中的 rabbitmqctl 工具来创建。
8 持久化和你的策略
默认情况下队列、交换器无法幸免于服务器重启。重启 RabbitMQ 服务器后,它们就都消失了(随同里面的消息)。每个队列和交换器的 durable 属性,默认情况为 false,它决定了 RabbitMQ 是否需要在崩溃或者重启后重新创建队列(或者交换器)。将它们设置为 true,这样你就不需要在服务器断电后重新创建队列和交换器了。但这样还不够。
能从 AMQP 服务器崩溃中恢复的消息,我们称之为持久化。在消息发布前,通过把它的“投递模式” (delivery mode)选贤设置为2来把消息标记成持久化。到目前为止,消息还只是被表示为持久化,但它还必须被发不到持久化的交换器中并到达持久化的队列中才行。
- 把它的投递模式选项设置为2(持久)
- 发送到持久化的交换器
- 到达持久化的队列
9 事务
和消息持久化相关的一个概念是 AMQP 事务(transaction)。
在 AMQP 中,在把信道设置成事务模式后,通过信道发送那些想要确认的消息,之后还有多个其他 AMQP 命令。这些命令是执行还是忽略,取决于第一条消息发送是否成功。
10 发送方确认模式
需要告诉 Rabbit 将信道设置成 confirm 模式,一旦信道进入 confirm 模式,所有在信道上发布的消息都会被指派一个唯一的ID号(从1开始).消息匹配队列后,信道会发送一个发送方确认模式给生产者应用程序(包含消息的ID号)。这使得生产者知晓消息已经安全到达目的队列了。
网友评论