【问题标题】:Settings Autoack true in Rabbitmq and celery在 Rabbitmq 和 celery 中设置 Autoack true
【发布时间】:2018-01-30 13:53:58
【问题描述】:

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

【问题讨论】:

  • 我投票决定关闭,因为您没有提供足够的信息让我们帮助您。根据您提供的描述,消息没有从队列中删除,但这可能有很多原因。请提供有关您正在使用的代码的详细信息。
  • 1.这个问题的一个原因是我将在队列中推送更多消息并且从队列中消耗消息的速率更少......因此队列中的消息不断增加并且Rabbitmq保留消息在内存中,随着内存使用量的增加,rabbitmq 在 vm_memory_high_watermark 之后不再接收任何消息 ..
  • 2.我只想芹菜配置。这样一旦消息被 celery 或 consumer 消费,该消息就会自动从 rabbitmq 中删除。
  • 但是你的问题是什么?该行为描述了我的默认行为。
  • 如果您从不从队列中删除消息,那么这正是将要发生的事情。为什么处理完消息后不确认消息?

标签: rabbitmq celery django-celery


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • 你能告诉我们如何配置 python Celery(从消费者端),以便一旦消息被消费,我将从队列中删除。我如何在 celery 中应用 auto-ack true。
  • 对不起,我不使用 Celery。也许搜索“celery auto ack”或在 SO 上提出另一个问题,以便知道的人可以回答。或者也许其他人可以在这里发布另一个答案。
  • 请告诉我如何处理来自 rabbitmq 的未确认消息。
  • 杀死并重新启动 Celery 进程。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-08
  • 2017-10-24
  • 2017-04-17
  • 2011-07-18
  • 2011-07-17
  • 2016-12-01
相关资源
最近更新 更多