过期的消息传递序列RabbitMQ

use*_*185 1 amqp rabbitmq spring-amqp rabbitmq-exchange

我们正在构建一个解决方案,将消息发布到超时队列。TTL 过期后的消息会被推送到主队列进行重新处理。

我们正在设置计数器值,以便将针对 x 号尝试消息。重新交付的次数。

解决方案工作正常。但是场景是当头部位置最高的消息 TTL 没有过期时,其他过期的消息不会被重新发布(到主队列)。

这种理解正确吗?如果是,解决方案是什么,以便在 TTL 之后重新处理每条消息。

欣赏答案/观点。

谢谢。

pin*_*ain 5

如果您使用每个队列的消息 TTL,则消息将过期并从队列中从头到尾移除(以它们发布的相同顺序)。

当你使用 per-message TTL 时,只有当消息到达队列头时才会从队列中删除,所以过期消息仍然驻留在队列中间的情况是正常的。此类消息不会发送给消费者,并且会被死信(或丢弃),但由于严格的 FIFO 性质或 RabbitMQ 的队列会发生上述情况,当它们到达队列头时,移除前的延迟可能大于实际消息 TTL . 例如,如果有两条消息,第一条 TTL=10 秒,第二条 TTL=1 秒,第二条消息也将在 10 秒内进行死信处理,而在第一条消息之后。

为了处理具有不同 TTL 的消息,常见的解决方法是声明几个队列,每个队列用于具有相同 TTL 或几乎相同的消息,例如,精度为 10 秒。实际精度可能会有所不同,但它非常特定于应用程序并且以某种方式具有经验值。

如果您将选择单独的 per-TTL 队列,请使用 per-queue TTL 而不是 per-message TTL 以简化消息工作流程并防止消除对消息发生情况的理解的歧义。您之后的开发人员会为此感谢您。

要在 TTL 使用Dead Letter Exchanges后重新处理消息,但要注意循环消息问题:如果 RabbitMQ 代理检测到您的消息工作流循环了(消息在被死信后被发布到具有相同路由键的同一个交换),它会默默地丢弃消息。