【发布时间】:2021-07-29 05:18:06
【问题描述】:
我使用 EasyNetQ (ISubscriptionConfiguration.WithExpires) 创建了带有 x-expires 策略的 RabbitMQ 队列。我遇到了有消费者的队列过期并被删除的情况,意外终止了我对队列的订阅。
official RabbitMQ docs on Queue TTL 指定
队列只有在一段时间没有被使用时才会过期(例如没有消费者)。
它还将“未使用”定义为含义
队列没有消费者,队列最近没有被重新声明(重新声明更新租约),并且 basic.get 至少在到期期限内没有被调用。 p>
基于此,我希望队列只有在没有消费者的情况下才会过期。这意味着,即使队列在过期期间没有收到消息,队列的消费者也会阻止它过期。
我对文档的解释不正确吗?如果有消费者,为什么我的队列会过期?
【问题讨论】:
-
你的解释是正确的。过期多久了,确定没有网络卡顿吗?
-
我的
x-expires值是28800000(8 小时),所以我想在这样的时间范围内可能会出现网络故障。当我最后一次遇到这种情况时,我再次检查了产生消费者的连接是否仍然存在,并且确实存在。我还启用了auto-delete。由 EasyNetQ 创建的队列是否有可能被网络故障自动删除? -
是的,auto-delete会在所有消费者断开连接的情况下立即删除队列,所以基本上就是x-expires=0。
-
我也有同样的问题,我没有启用自动删除,只是WithExpires选项,仍然有到MQServer的连接,它们在同一台物理机器上,所以不是网络问题。但是队列在过期后从服务器中删除,即使我的程序仍在侦听消息。