具有过期时间的消息未从RabbitMQ中删除

12
我通过生产者向RabbitMQ发送一条普通消息,然后发送第二条消息并将expiration属性赋值为一个值。然后使用rabbitmqctl list_queues命令监控消息的状态。
我发现,如果我先发送一条普通消息,然后发送一条具有expiration的消息,rabbitmqctl list_queues始终显示队列中有2条待处理消息。但是当我消费它们时,我只收到一条消息。
另一方面,如果我只发送1条带有expiration的消息,在开始时我可以看到这条消息,然后在正确的过期时间之后,我发现它已被删除。
我的问题是,在第一种情况下,消息实际上是否占用空间?还是这是一个界面上的错误?
我的RabbitMQ版本是: rabbitmq-server.noarch -> 3.1.5-1.el6

相关:http://stackoverflow.com/questions/26206512/expired-message-delivery-sequence-rabbitmq - pinepain
1个回答

31

看起来您错过了有关此功能的一些文档。 如果您阅读RabbitMQ有关每条消息的 TTL(过期)的文档,您将注意到以下警告,正好对于您所看到的行为(强调添加):

注意事项

尽管消费者永远不会看到过期的消息,但只有当过期的消息到达队列的头部时,它们才会被实际丢弃(或死信)。 当设置基于队列的TTL时,这不是问题,因为过期的消息始终在队列的头部。然而,当设置每条消息的TTL时,已过期的消息可能会排在未过期的消息后面,直到后者被消耗或过期。 因此,这些过期消息使用的资源将不会被释放,并且它们将计入队列统计信息中(例如,队列中的消息数)。


所以,消息的message-ttl或过期时间值意味着"如果太晚了,它将不会被投递,但会保留在队列中"和"你必须等待这么长时间,而不向队列发送任何消息,才能清空它"。这有点复杂。 - undefined
@nurettin - 这是一个非常古老的答案,行为可能自那时起已经发生了变化。 - undefined
我亲身经历过,如果没有人从队列中读取消息,message-ttl会导致消息被卡在队列中。即使它们已经过期并且没有任何价值。 - undefined
@nurettin 没问题。一个无限累积消息且没有处理器的队列并不适合作为RMQ的使用案例。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接