芹菜和兔子MQ超时和连接重置



我在 Django 应用程序中的 Windows 10 机器上使用 RabbitMQ 3.6.0 和 Celery 3.1.20。一切都在同一台计算机上运行。我已经将芹菜配置为确认延迟(CELERY_ACKS_LATE=True(,现在我遇到了连接问题。

我启动 Celery 工作线程,在处理任务 50-60 秒后,每个工作线程都会失败,并显示以下消息:

无法确认 ###,原因:连接重置错误(10054,"远程主机强行关闭了现有连接",无,10054,无(

(### 是任务的编号(

当我查看 RabbitMQ 日志时,我看到以下内容:

=信息报告==== 2016年2月10日::22:16:16 === 接受 AMQP 连接 <0.247.0> (127.0.0.1:55372 -> 127.0.0.1:5672(

=信息报告==== 2016年2月10日::22:16:16 === 接受 AMQP 连接 <0.254.0> (127.0.0.1:55373 -> 127.0.0.1:5672(

=错误报告==== 2016 年 2 月 10 日::22:17:14 === 关闭 AMQP 连接<0.247.0> (127.0.0.1:55372 -> 127.0.0.1:5672(: {writer,send_failed,{error,timeout}}

该错误恰好发生在 Celery 工作人员重置连接时。

我认为这是 AMQP 心跳问题,所以我在我的 Celery 设置中添加了BROKER_HEARTBEAT = 15,但这没有任何区别。

我在长时间运行的 Windows 上使用芹菜时遇到了类似的问题并发性 = 1 的任务。以下配置终于适用于我:

CELERY_ACKS_LATE = True
CELERYD_PREFETCH_MULTIPLIER = 1

我还使用 -Ofair 选项启动了芹菜工人守护进程:

celery -A test worker -l info -Ofair

在我有限的理解中,CELERYD_PREFETCH_MULTIPLIER设定了数字位于特定 Celery 工作人员队列中的消息。由默认值设置为 4。如果将其设置为 1,则每个工作人员将仅使用一条消息并在使用另一条消息之前完成任务消息。我在长时间运行的任务时遇到问题,因为在漫长的任务中,与 RabbitMQ 的连接一直丢失,但是然后,如果任何其他消息/任务正在等待,则重新尝试该任务在芹菜队列中。

以下选项也特定于我的情况:

CELERYD_CONCURRENCY = 1

将并发设置为 1 对我来说很有意义,因为我运行了很长时间需要大量 RAM 的任务,因此每个任务都需要单独运行。

@bbaker CELERY_ACKS_LATE的解决方案(在 Celery 4x 中task_acks_late(本身对我不起作用。我的工作在 Kubernetes pod 中,必须使用 --pool solo 运行,每个任务需要 30-60 秒。

我通过包括broker_heartbeat=0解决了它

broker_pool_limit = None
task_acks_late = True
broker_heartbeat = 0
worker_prefetch_multiplier = 1

相关内容

  • 没有找到相关文章