RabbitMQ,如何在 n 次重新排队尝试后删除消息
RabbitMQ, How to drop a message after n re-queuing attempt
我正在尝试通过使用 RabbitMQ 和 JAVA 构建一种异步服务器。我有两个交换器 Original_Exch 和 Dead_Exch,每个交换器有一个队列。两个交换都被声明为 DLX(彼此队列的死信交换)。
现在问题来了,我正在以 json 字符串的形式向 Original_Exch 发布消息,其中包含电子邮件信息(例如收件人、主题、消息正文、附件等).从绑定到 Original_exch 的队列中使用此消息后,我将电子邮件发送到指定的电子邮件地址。如果电子邮件未成功发送,我会将此消息传输到 Dead_Exch,并在 2 秒后(使用 TTL)将消息再次传输到 Original_Exch。
让我们假设一个特定的消息由于持续失败而从一个交换器移动到另一个交换器的场景。在那种情况下,我想确保如果它已被转移到 Original_Exch 10 次,它应该从队列中永久删除(删除)并且不应转移到 Dead_Exch.
几乎类似的问题有很多答案,但其中 none 是令人满意的(从学习者的角度来看)。
谢谢..........
已经 dead-letterred 的消息有一个 x-death
header,详细说明了它通过了哪些 queue(s) 和多少次。在 RabbitMQ 网站上查看 article about dead-letter exchanges。
所以你可以使用这个 header 做你想做的事。我看到两个解决方案:
- 在您的消费者中,当邮件无法投递时,查看
x-death
header 并决定是否要 dead-letter 它(Basic.Nack 与 requeue
设置为 false) 或删除它 (Basic.Ack).
- 为
Dead_Exch
使用 header 交换类型并配置绑定以匹配 x-death
。
因为header交换只对header值做精确匹配,所以第一种方案更灵活,更少error-prone.
我正在尝试通过使用 RabbitMQ 和 JAVA 构建一种异步服务器。我有两个交换器 Original_Exch 和 Dead_Exch,每个交换器有一个队列。两个交换都被声明为 DLX(彼此队列的死信交换)。
现在问题来了,我正在以 json 字符串的形式向 Original_Exch 发布消息,其中包含电子邮件信息(例如收件人、主题、消息正文、附件等).从绑定到 Original_exch 的队列中使用此消息后,我将电子邮件发送到指定的电子邮件地址。如果电子邮件未成功发送,我会将此消息传输到 Dead_Exch,并在 2 秒后(使用 TTL)将消息再次传输到 Original_Exch。
让我们假设一个特定的消息由于持续失败而从一个交换器移动到另一个交换器的场景。在那种情况下,我想确保如果它已被转移到 Original_Exch 10 次,它应该从队列中永久删除(删除)并且不应转移到 Dead_Exch.
几乎类似的问题有很多答案,但其中 none 是令人满意的(从学习者的角度来看)。
谢谢..........
已经 dead-letterred 的消息有一个 x-death
header,详细说明了它通过了哪些 queue(s) 和多少次。在 RabbitMQ 网站上查看 article about dead-letter exchanges。
所以你可以使用这个 header 做你想做的事。我看到两个解决方案:
- 在您的消费者中,当邮件无法投递时,查看
x-death
header 并决定是否要 dead-letter 它(Basic.Nack 与requeue
设置为 false) 或删除它 (Basic.Ack). - 为
Dead_Exch
使用 header 交换类型并配置绑定以匹配x-death
。
因为header交换只对header值做精确匹配,所以第一种方案更灵活,更少error-prone.