在Rabbitmq和芹菜中设置Autoack为true

时间:2018-01-30 13:53:59

标签: rabbitmq celery django-celery

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

1 个答案:

答案 0 :(得分:1)

好的,所以虽然我不完全理解为什么你有问题,但很明显发生了什么。

  1. 发布商将消息任务放入队列
  2. 您的工作进程会提取消息并对其进行处理
  3. 邮件实际上从未从队列中删除
  4. 当消费者未能确认消息处理时,会发生此行为。要确认,如果查看RabbitMQ管理插件,您将看到一大堆未确认的消息。这些将无法使用,但将继续保留在服务器上并占用磁盘空间和内存。

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

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

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