三、消息与队列

2019-12-11  本文已影响0人  lancelea

消息队列,消息队列,在了解了 AMQP 协议与 AMQP 的几个相关概念后,让我们一起来学习下创建队列的方法,以及消息在队列当中的一些动态变化。

消费者接收消息的方式

消息最终达到队列中并等待消费。消费者通过以下两种方式从特定的队列中接收消息:

队列的消息分发机制

如果消息到达了无人订阅的队列时消息会在队列中等待。一旦有消费者订阅到该队列,队列上的消息就会发送给消费者;如果至少有一个消费者订阅了队列的话,队列会将收到的消息将以循环(round-robin)的方式发送给这些订阅的消费者。并且每条消息只会发送给其中的一个订阅的消费者,而不是所有订阅的消费者。

举例说明:假设有 seed_queue 队列,消费者 Farmer_one 和消费者 Farmer_two 订阅到 seed_queue 队列。当消息到达 seed_queue 队列时,消息投递方式如下:
(1)消息 Message_A 到达 seed_queue 队列。
(2)RabbitMQ 把消息 Message_A 发送给 Farmer_one。
(3)Farmer_one 确认接收到了消息 Message_A。
(4)RabbitMQ 把消息 Message_A 从 seed_queue中删除。
(5)消息 Message_B 到达 seed_queue 队列。
(6)RabbitMQ 把消息 Message_B 发送给 Farmer_two。
(7)Farmer_two 确认接收到了消息 Message_B。
(8)RabbitMQ 把消息 Message_B 从 seed_queue 中删除。

消息的确认

消费者接收到的每一条消息都必须进行确认,才能够从队列获取到下一条消息,同时 RabbitMQ 才能安全地把消息从队列中删除。这样做的目的是保证每一条消息都能够被正确消费——不重复消费、不漏消费。

举例说明:

提示:如果处理消息内容非常耗时,可以延迟确认该消息,直到消息处理完成。这样可以防止 Rabbit 持续不断的消息涌向你的应用而导致过载。

消息确认的方式

消息的拒绝

假设在处理消息的时候遇到了不可恢复的错误,但是由于硬件问题,只影响到当前的消费者,只要消息尚未确认,就有以下两个选择:

队列的创建

消费者和生产者都能使用 AMQP 的 queue.declare 命令来创建队列。但是如果消费者在同一条信道上订阅了另一个队列的话,就无法再声明队列了。必须首先取消订阅,将信道置为“传输”模式。如果创建时不指定队列名称的话,Rabbit 会分配一个随机名称并在 queue.declare 命令的响应中返回。

设置队列的参数:

声明已存在的队列会怎样

只要声明参数完全匹配现存的队列的话,Rabbit 就什么都不做,并成功返回;如果参数不匹配的话,队列声明尝试会失败。

如果你只是想检测队列是否存在,则可以设置 queue.declare 的 passive 选项为 true。在该设置下,如果队列存在,那么 queue.declare 命令会成功返回;如果果队列不存在的话,queue.declare 命令不会创建队列而会返回一个错误。

队列由谁创建

生产者和消费者都可以尝试去创建队列。单纯有生产者创建会有可能导致消费者订阅到不存在的队列导致错误;单纯由消费者创建会可能导致消费者发布消息到“黑洞”。

上一篇 下一篇

猜你喜欢

热点阅读