Celery 和 RabbitMQ 超时和连接重置

zmb*_*mbq 3 django rabbitmq celery

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

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

无法确认 ###,原因:ConnectionResetError(10054, '现有连接被远程主机强行关闭', None, 10054, None)

(###为任务编号)

当我查看 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)

=错误报告==== 10-Feb-2016::22:17:14 === 关闭 AMQP 连接 <0.247.0> (127.0.0.1:55372 -> 127.0.0.1:5672): {writer,send_failed, {错误,超时}}

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

我认为这是一个 AMQP Heartbeat 问题,所以我已经添加BROKER_HEARTBEAT = 15到我的 Celery 设置中,但它没有任何区别。

bba*_*ker 5

我在 Windows 上的 Celery 遇到了类似的问题,并发=1 的长时间运行的任务。以下配置最终对我有用:

CELERY_ACKS_LATE = True
CELERYD_PREFETCH_MULTIPLIER = 1
Run Code Online (Sandbox Code Playgroud)

我还使用 -Ofair 选项启动了 celery worker 守护进程:

celery -A test worker -l info -Ofair
Run Code Online (Sandbox Code Playgroud)

在我有限的理解中, CELERYD_PREFETCH_MULTIPLIER 设置位于特定 Celery 工作线程队列中的消息数。默认设置为 4。如果设置为 1,则每个 worker 将只消费一条消息并在消费另一条消息之前完成任务。我遇到了长时间运行任务的问题,因为与 RabbitMQ 的连接在长任务中间始终丢失,但是如果任何其他消息/任务在 celery 队列中等待,则重新尝试该任务。

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

CELERYD_CONCURRENCY = 1
Run Code Online (Sandbox Code Playgroud)

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