我正在使用celery和rabbitmq,但由于在队列中推送了几个任务,我的服务器内存利用率变得超过40%,因此兔子不会接受任何任务。所以我想删除那些已经执行的消息,但是由于rabbitmq的持久行为,这些消息不会自动删除,所以我想设置一些配置,如autoAck = True,这样如果消息是从芹菜消费的,它将从rabbitmq队列,也来自我的服务器内存。请解释我们如何做到这一点。
答案 0 :(得分:1)
好的,所以虽然我不完全理解为什么你有问题,但很明显发生了什么。
当消费者未能确认消息处理时,会发生此行为。要确认,如果查看RabbitMQ管理插件,您将看到一大堆未确认的消息。这些将无法使用,但将继续保留在服务器上并占用磁盘空间和内存。
此外,如果您执行Basic.Recover
,则所有这些消息将被转储回队列以便再次处理。
此问题是由于您的使用者配置不正确造成的。有两种方法可以解决这个问题:
Basic.Consume
),即可完成此操作。 修改:看起来这可能是default behavior of Celery。Basic.Ack
)。 修改:这是通过Celery中的acks_late属性完成的。