RabbitMQ 排队消息不断增加

Eri*_*aal 4 python rabbitmq celery

我们有一个基于 Windows 的 Celery/RabbitMQ 服务器,它为我们的 Web 应用程序在进程外执行长时间运行的 Python 任务。
例如,它的作用是获取一个 CSV 文件并处理每一行。对于每一行,它都会在我们的数据库中登记一个或多个记录。

这似乎工作正常,我可以看到工作进程正在预订的记录。但是,当我使用管理插件(基于 Web 的管理工具)检查rabbitMQ 服务器时,我看到排队的消息在增加,并且没有回落。 排队消息图表

在连接下,我看到 116 个连接,每个虚拟主机大约 10-15 个,全部“正在运行”,但是当我点击时,它们中的大多数都将“空闲”作为状态。我也想知道为什么这些连接仍然打开,如果有什么我需要改变以使它们自己关闭: 在此处输入图片说明

在“队列”下,我可以看到 6200 多个状态为“空闲”且没有减少的项目。

所以具体来说,我在问这些是否是正常的统计数据,或者我是否应该担心队列增加但不会回落以及似乎没有关闭的持久连接......

除了管理工具中相当简洁的帮​​助之外,我似乎找不到任何关于这些统计数据的含义以及它们是好是坏的信息。

我还想知道为什么消息在队列中仍然可见,以及为什么它们没有被删除,因为任务似乎没有完成。

任何帮助表示赞赏。

Eri*_*aal 6

回答我自己的问题;

Celery 为调用代码中的每个任务发送一个结果消息。此消息通过相同的 AMPQ 队列发回。这就是任务正常运行但队列不断填​​满的原因。我们没有处理这些结果,甚至对它们不感兴趣。

我添加ignore_result=True到芹菜任务,做任务也不能发送结果消息回到队列中。这是解决问题的主要方法。

此外,添加了配置选项 CELERY_SEND_EVENTS=False 以加速 celery。如果设置为 TRUE,则此选项让 Celery 为外部监控工具发送事件。

最重要的是, CELERY_TASK_RESULT_EXPIRES=3600 现在确保即使结果被发回,如果没有被提取/确认,它们也会在一小时后过期。

最后将 CELERY_RESULT_PERSISTENT 设置为 False,这将 celery 配置为不在磁盘上存储这些结果消息。当服务器崩溃时,它们会消失,这在我们的例子中很好,因为我们不使用它们。

简而言之;如果您的应用程序中不需要有关任务是否完成以及何时完成的反馈,请ignore_result=True在 celery 任务上使用,这样就不会发回任何消息。如果您确实需要该信息,请确保您选择并处理结果,以便队列停止填满。