过期的邮件传递序列RabbitMQ

rabbitmq amqp spring-amqp rabbitmq-exchange

790 观看

2回复

464 作者的声誉

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

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

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

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

欣赏答案/观点。

谢谢。

作者: user2775185 的来源 发布者: 2014 年 10 月 5 日

回应 (2)


4

9493 作者的声誉

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

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

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

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

在TTL使用死信交换之后重新处理消息,但要小心循环消息问题:如果RabbitMQ代理检测到您的消息工作流程已循环(消息在从其中分解出来后发布到具有相同路由密钥的同一交换),则将默默地丢弃消息。

作者: pinepain 发布者: 06.10.2014 07:24

0

64 作者的声誉

队列ttl很简单,工作正常。但设置每条消息ttl不能正常工作:每条消息在ttl之后发布到在线消费者。

为什么rabbitmq提供此功能?对于哪些商业场景?

作者: geosmart 发布者: 09.08.2019 11:43
32x32