我使用的是芹菜和rabbitmq,但由于在队列中推送了几个任务,我的服务器内存利用率变得超过40%,这样兔子进一步不会接受任何任务。 所以我想删除那些已经执行的消息,但由于 rabbitmq 的持久行为,这些消息不会自动删除,所以我想设置一些配置,如 autoAck=True, 这样,如果消息是从芹菜中消耗的,它将从 RabbitMQ 队列以及我的服务器内存中删除。请解释我们如何做到这一点.
好的,虽然我不完全明白为什么你有这样的问题,但很清楚发生了什么。
- 发布者将消息任务放入队列
- 您的工作进程提取消息并对其进行处理
- 邮件实际上永远不会从队列中删除
当使用者未能确认消息的处理时,会发生此行为。 为了确认,如果您查看 RabbitMQ 管理插件,您将看到一大堆未确认的消息。它们将不可用于使用,但将继续保存在服务器上并占用磁盘空间和内存。
此外,如果您执行Basic.Recover
,所有这些消息将被转储回队列中以再次处理。
此问题是由于使用者配置不正确造成的。有两种方法可以解决此问题:
- 您可以将使用者配置为自动确认(即在收到消息时自动确认消息)。这是在声明使用者(使用
Basic.Consume
)时完成的。编辑:看起来这可能是芹菜的默认行为。 - 您可以将工作进程配置为提交确认(使用
Basic.Ack
)。编辑:这是通过芹菜中的acks_late属性完成的。