【问题标题】:Missing messages sent from Celery in RabbitMQ queue在 RabbitMQ 队列中缺少从 Celery 发送的消息
【发布时间】:2021-07-29 15:17:29
【问题描述】:

我有一个脚本在名为 vv 的特定队列中调用 Celery 的 send_task 函数 3047 次。使用rabbitmqadmin list queues 命令,我注意到队列中只有2870 条消息,没有任何worker 连接到vv 队列。

你自己有没有经历过这种行为?这只是来自rabbitmqadmin 的显示错误吗?

提前感谢您的帮助,如果您需要有关脚本的更多详细信息,我将完成我的问题!

编辑:脚本长这样,有大量文档,由celery-beat触发

from celery import Celery

app = Celery()
app.config_from_object('celeryconfig')

@app.task
def document_monitoring(index, query, kind):
    # generate random messages
    documents = [{'_id': str(i)} for i in range(10000)]

    for document in documents:
        app.send_task(
                "vv_consumer", 
                kwargs=document,
                queue='vv'
        )

    return 0

【问题讨论】:

  • 请用一个可重复的最小示例完成您的问题。
  • 我已经用可重现的例子完成了这个问题,消息的数量是那个数量级的。此过程由每分钟 celery-beat 触发
  • 我认为这没有什么问题。为什么你会认为这是一个错误?
  • 当我监控vv 队列中的消息数量时,我收到的消息少于send_task 的调用数量。一些消息消失了,没有发送到队列中。

标签: python rabbitmq celery


【解决方案1】:

在深入研究我的 RabbitMQ 实例的日志后,我发现我达到了由变量 vm_memory_high_watermark 定义的 Memory Alarms 的限制。默认值设置为 0.4,这意味着一旦使用了 40% 的实例 RAM,RabbitMQ 就会阻止发布者(如示例中的脚本)并停止接收新消息。由于这种行为,我错过了几条最初发送到队列的消息。

为了解决这个问题,我的解决方案是:

  • 硬件方面:增加我的实例的 RAM
  • 软件方面:将vm_memory_high_watermark 的值增加到0.7(遵循doc)

【讨论】:

    猜你喜欢
    • 2022-06-10
    • 2016-07-13
    • 2016-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-09
    相关资源
    最近更新 更多