过期的邮件传递序列RabbitMQ

时间:2014-10-05 19:46:01

标签: rabbitmq amqp spring-amqp rabbitmq-exchange

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

我们正在设置计数器值,以便为x no尝试消息。重新开始的次数。

解决方案工作正常。但情况是当头位置上的消息最高TTL未到期时,其他有效期较短的消息将不会被重新发布(到主队列)。

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

赞赏答案/观点。

感谢。

2 个答案:

答案 0 :(得分:3)

如果您使用每队列消息TTL,则消息过期并从头到尾从队列中删除(按照它们发布的顺序)。

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

要处理具有不同TTL的消息,常见的解决方法是声明几个队列,每个队列用于具有相同TTL或几乎相同的消息,比如精确10秒。实际精度可能会有所不同,但它具有特定应用性和某种经验值。

如果您要选择单独的每TTL队列,请使用每个队列TTL而不是每个消息TTL,以便于消息工作流程,并防止消除歧义,了解消息会发生什么。开发人员之后会感谢你。

要在TTL使用Dead Letter Exchanges后重新处理消息,但要注意循环消息问题:如果RabbitMQ代理检测到您的消息工作流程已循环(消息在被破坏后被发布到具有相同路由密钥的同一交换机从它),它将默默地丢弃消息。

答案 1 :(得分:0)

队列ttl很简单并且可以正常工作。 但是按消息ttl设置的功能预期无法正常工作:每条消息都会在ttl之后发布给在线消费者。

为什么rabbitmq提供此功能?哪种商务场景?