过期的消息传递序列RabbitMQ

过期的消息传递序列RabbitMQ,rabbitmq,amqp,spring-amqp,rabbitmq-exchange,Rabbitmq,Amqp,Spring Amqp,Rabbitmq Exchange,我们正在构建一个解决方案,将消息发布到超时队列。TTL到期消息被推送到主队列进行重新处理后 我们正在设置计数器值,以便邮件将尝试x次,以便重新交付 这个解决方案很有效。但该场景是当头部位置上的消息为最高TTL未过期时,其他到期时间较低的消息将不会重新发布到主队列 这种理解正确吗?如果是,解决方案是什么,以便在TTL之后重新处理每条消息 欣赏答案/观点 谢谢。如果您使用每队列消息TTL,则消息将过期,并按照其发布的相同顺序从头到尾从队列中删除 当使用每个消息TTL时,消息只在队列到达队列头时从队列

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

我们正在设置计数器值,以便邮件将尝试x次,以便重新交付

这个解决方案很有效。但该场景是当头部位置上的消息为最高TTL未过期时,其他到期时间较低的消息将不会重新发布到主队列

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

欣赏答案/观点


谢谢。

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

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

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

如果要选择单独的每TTL队列,请使用每队列TTL而不是每消息TTL,以简化消息工作流,并防止在理解消息时出现歧义。开发人员在您之后会为此感谢您


要在使用TTL后重新处理消息,请注意循环消息问题:如果RabbitMQ broker检测到您的消息工作流循环消息在从同一交换机发出死信后使用相同的路由密钥发布到同一交换机,它将以静默方式丢弃消息。

如果使用每队列消息TTL,然后消息过期,并按照发布的顺序从头到尾从队列中删除

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

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

如果要选择单独的每TTL队列,请使用每队列TTL而不是每消息TTL,以简化消息工作流,并防止在理解消息时出现歧义。开发人员在您之后会为此感谢您


要在使用TTL后重新处理消息,请注意循环消息问题:如果RabbitMQ broker检测到您的消息工作流循环消息在从同一个exchange发出死信后使用相同的路由密钥发布到同一个exchange,它将自动丢弃消息。

队列TTL足够简单,工作正常。 但SETPER message ttl并没有达到预期的效果:每个消息都在ttl之后发布给在线消费者


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

队列ttl足够简单,工作正常。 但SETPER message ttl并没有达到预期的效果:每个消息都在ttl之后发布给在线消费者


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

队列ttl足够简单,工作正常。但SETPER message ttl并没有达到预期的效果:每个消息都在ttl之后发布给在线消费者。为什么rabbitmq提供此功能?对于哪种业务场景?队列ttl足够简单,工作正常。但SETPER message ttl并没有达到预期的效果:每个消息都在ttl之后发布给在线消费者。为什么rabbitmq提供此功能?哪种商业场景?