- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
消费者收到消息后,消费者/ worker 进行一些验证,然后调用 Web 服务。在这个阶段,如果发生任何错误或验证失败,我们希望将消息放回最初使用它的队列。
我已阅读 RabbitMQ 文档。但我对拒绝、nack 和取消方法之间的区别感到困惑。
最佳答案
简短回答:
要重新排队特定消息,您可以同时选择 basic.reject
或 basic.nack
与 multiple
标志设置为假。basic.consume
如果您使用消息确认并且在特定时间消费者有未确认的消息并且消费者在没有确认它们的情况下退出,则调用也可能导致消息重新传递。basic.recover
将在特定 channel 上重新传递所有未确认的消息。
长答案:
basic.reject
和 basic.nack
两者都用于相同的目的 - 丢弃或重新排队特定消费者无法处理的消息(在给定时刻,在某些条件下或根本不处理)。它们之间的主要区别在于 basic.nack
支持批量消息处理,而 basic.reject
没有。
Negative Acknowledgements 中描述了这种差异。 RabbitMQ 官方网站上的文章:
The AMQP specification defines the
basic.reject
method that allows clients to reject individual, delivered messages, instructing the broker to either discard them or requeue them. Unfortunately,basic.reject
provides no support for negatively acknowledging messages in bulk.To solve this, RabbitMQ supports the
basic.nack
method that provides all the functionality ofbasic.reject
whilst also allowing for bulk processing of messages.To reject messages in bulk, clients set the
multiple
flag of thebasic.nack
method totrue
. The broker will then reject all unacknowledged, delivered messages up to and including the message specified in thedelivery_tag
field of thebasic.nack
method. In this respect,basic.nack
complements the bulk acknowledgement semantics ofbasic.ack
.
basic.nack
方法是 RabbitMQ 特定的扩展,而
basic.reject
方法是 AMQP 0.9.1 规范的一部分。
basic.cancel
方法,它用于通知服务器客户端停止消息消费。请注意,该客户端可能会收到
basic.cancel
之间的任意消息编号。方法发送接收
cancel-ok
回复。如果客户端使用消息确认并且它有任何未确认的消息,它们将被移回最初使用它们的队列。
basic.recover
在 RabbitMQ 中有一些限制:它
basic.recover
有部分支持(不支持使用 requeue=false 进行恢复。)
basic.consume
的注意事项:
basic.consume
在没有自动确认 (
noack=false
) 的情况下启动,并且有一些未确认的消息未确认消息,然后当消费者被取消(死亡、 fatal error 、异常等)时,将重新传递未决消息。从技术上讲,在消费者释放它们(ack/nack/reject/recover)之前,不会处理待处理的消息(甚至是死信)。只有在那之后,它们才会被处理(例如,死信)。
Queue(main) (tail) { [4] [3] [2] [1] [0] } (head)
Queue(main) (tail) { [4] [3] [2*] [1*] [0*] } (head)
*
) 指出
redelivered
标志设置为
true
.
Exchange(e-main) Exchange(e-dead)
Queue(main){x-dead-letter-exchange: "e-dead"} Queue(dead)
expire
发布 5 条消息属性设置为
5000
(5 秒):
Queue(main) (tail) { [4] [3] [2] [1] [0] } (head)
Queue(dead) (tail) { }(head)
main
的 3 条消息排队并保持 10 秒:
Queue(main) (tail) { [2!] [1!] [0!] } (head)
Queue(dead) (tail) { [4*] [3*] } (head)
!
) 代表未确认的消息。此类消息无法传递给任何消费者,并且通常无法在管理面板中查看。但是让我们取消消费者,记住,它仍然持有 3 条未确认的消息:
Queue(main) (tail) { } (head)
Queue(dead) (tail) { [2*] [1*] [0*] [4*] [3*] } (head)
basic.get
方法说明更多。
关于rabbitmq - 如何在 RabbitMQ 中重新排队消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24107913/
我是一名优秀的程序员,十分优秀!