RabbitMQ 排队的消息不断增加

RabbitMQ Queued messages keep increasing

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

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

在连接下,我看到 116 个连接,每个虚拟主机大约 10-15 个,全部 "running",但是当我点击时,大多数连接的状态为 'idle'。 我也想知道为什么这些连接仍然打开,如果我需要更改某些内容以使它们自行关闭:

在 'Queues' 下,我可以看到状态为 'idle' 的 6200 多个项目,并且没有减少。

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

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

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

感谢任何帮助。

如果您不需要可靠性,那么您可以让您的队列瞬态化。

http://celery.readthedocs.org/en/latest/userguide/optimizing.html#optimizing-transient-queues

CELERY_DEFAULT_DELIVERY_MODE = 'transient'

回答我自己的问题;

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

我将 ignore_result=True 添加到 celery 任务,因此该任务 不会 将结果消息发送回队列。这是解决问题的主要方法。

此外,配置选项 CELERY_SEND_EVENTS=False 被添加到加速芹菜。如果设置为 TRUE,此选项会让 Celery 为外部监控工具发送事件。

最重要的是 CELERY_TASK_RESULT_EXPIRES=3600 现在确保即使结果被发回,如果未被选中,它们也会在一小时后过期 up/acknowledged。

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

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