【问题标题】:RabbitMQ Dead Lettter queue never persistentRabbitMQ 死信队列从不持久
【发布时间】:2015-08-03 13:24:02
【问题描述】:

有没有办法确保当您 NACK 一条消息并将其发送到死信交换/队列时,该消息将是持久的?默认情况下,即使使用 SetPersistent(true) 将原始消息设置为持久性,死信消息也不会遵循套件。

【问题讨论】:

  • 是否有理由不将整个死信队列设置为持久化?
  • 这是一个选项吗?到目前为止,我只发现您可以在消息级别设置持久性。由于rabbit处理死信发布,我无法找到一种方法让它在BasicProperties(delivery_mode = 2)中设置持久位。
  • 是的,您可以使整个队列持久化。 Rabbit 使用的术语是“耐用”。这意味着队列将在兔子和/或服务器关闭后存活
  • 不完全是,持久性仅适用于队列配置;不是其中的消息。如果在服务重新启动或崩溃时添加没有 delivery_mode = 2(或 .net 客户端中的 SetPersistent(true))的消息,则队列中的所有消息都会丢失。我已经验证了这种行为。问题是兔子不会以与原始消息相同的持久性来编写死信消息。所以服务重启会丢弃死队列中的所有消息。
  • 如果消息被标记为持久并且DLQ标记为持久,则消息应该被持久化。使用 RabbitMQ 3.5 测试

标签: rabbitmq dead-letter


【解决方案1】:

RabbitMQ 不会修改死信消息的属性,除了过期消息:https://github.com/rabbitmq/rabbitmq-server/blob/master/src/rabbit_dead_letter.erl#L74

如果消息是使用deliver_mode=2 发布的,那么它应该作为持久性发布到死信队列中

【讨论】: