没有从RabbitMQ中删除过期的邮件

时间:2015-01-16 19:36:46

标签: rabbitmq messages ttl

我通过生产者向RabbitMQ发送正常消息,然后发送第二条消息,其中expiration属性分配给一个值。然后使用rabbitmqctl list_queues命令监视消息的状态。

我发现如果我首先发送普通邮件然后发送带有expiration的邮件,则rabbitmqctl list_queues始终会在队列中显示2条未决邮件。当我消费它们时,我只得到一个。

另一方面,如果我只发送一封带有expiration的邮件,则在开始时我会看到该邮件,然后在正确的到期时间后,我发现它已被删除。

我的问题是,第一种情况实际上是消息占用空间?或者它是一个界面错误?

我的rabbitMQ版本是: rabbitmq-server.noarch -> 3.1.5-1.el6

1 个答案:

答案 0 :(得分:15)

看起来您错过了有关此功能的一些文档。如果您阅读RabbitMQ documentation on per-message TTL (expiration),您会发现以下警告,表明您正在看到的行为(强调添加):

  

注意事项

     

虽然消费者永远不会看到过期的消息,但只有当过期的消息到达队列的头部时,它们才会被丢弃(或死信)。设置每个队列TTL时这不是问题,因为过期的消息总是在队列的头部。 但是,在设置每条消息的TTL时,过期的消息可以在非过期消息之后排队,直到后者消耗或过期。因此,这些过期消息使用的资源将不会被释放,并且它们将被计算在内队列统计信息(例如队列中的消息数)。