在 Rabbitmq 和 celery 中设置 Autoack true

use*_*321 1 rabbitmq celery django-celery

我正在使用celery和rabbitmq,但是由于在队列中推送了多个任务,我的服务器内存利用率变得超过40%,因此rabbit将不再接受任何任务。所以我想删除那些已经执行的消息,但是由于rabbitmq的持久行为,这些消息不会自动删除,所以我想设置一些配置,例如 autoAck=True ,这样如果从 celery 消耗消息,它将从rabbitmq 队列以及我的服务器内存。请解释一下我们该如何做到这一点。

the*_*yer 5

好吧,虽然我不完全理解你为什么会遇到这个问题,但很清楚发生了什么。

  1. 发布者将消息任务放入队列中
  2. 您的工作进程提取消息并处理它
  3. 该消息实际上从未从队列中删除

当消费者未能确认消息的处理时,就会发生此行为。为了确认这一点,如果您查看 RabbitMQ 管理插件,您将看到一大堆未确认的消息。这些将无法使用,但将继续保留在服务器上并占用磁盘空间和内存。

此外,如果您执行Basic.Recover,所有这些消息将被转储回队列中以再次处理。

此问题是由于您的消费者配置不正确造成的。有两种方法可以解决这个问题:

  1. 您可以将消费者配置为自动确认(即收到消息后自动确认)。这是在您声明消费者时完成的(使用Basic.Consume)。 编辑:看起来这可能是Celery 的默认行为
  2. 您可以配置工作进程以提交确认(使用Basic.Ack)。编辑:这是通过Celery 中的acks_late属性完成的。