我通过生产者向RabbitMQ发送正常消息,然后发送第二条消息,其中expiration
属性分配给一个值。然后使用rabbitmqctl list_queues
命令监视消息的状态。
我发现如果我首先发送普通邮件然后发送带有expiration
的邮件,则rabbitmqctl list_queues
始终会在队列中显示2条未决邮件。当我消费它们时,我只得到一个。
另一方面,如果我只发送一封带有expiration
的邮件,则在开始时我会看到该邮件,然后在正确的到期时间后,我发现它已被删除。
我的问题是,第一种情况实际上是消息占用空间?或者它是一个界面错误?
我的rabbitMQ版本是:
rabbitmq-server.noarch -> 3.1.5-1.el6
答案 0 :(得分:15)
看起来您错过了有关此功能的一些文档。如果您阅读RabbitMQ documentation on per-message TTL (expiration),您会发现以下警告,表明您正在看到的行为(强调添加):
注意事项
虽然消费者永远不会看到过期的消息,但只有当过期的消息到达队列的头部时,它们才会被丢弃(或死信)。设置每个队列TTL时这不是问题,因为过期的消息总是在队列的头部。 但是,在设置每条消息的TTL时,过期的消息可以在非过期消息之后排队,直到后者消耗或过期。因此,这些过期消息使用的资源将不会被释放,并且它们将被计算在内队列统计信息(例如队列中的消息数)。