Celery和RabbitMQ超时和连接重置

时间:2016-02-10 20:25:10

标签: 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,'现有连接被远程主机强行关闭',无,10054,无)

(###是任务编号)

当我查看RabbitMQ日志时,我看到了:

  

= INFO REPORT ==== 2016年2月10日:: 22:16:16 ===   接受AMQP连接< 0.247.0> (127.0.0.1:55372 - > 127.0.0.1:5672)

     

= INFO REPORT ==== 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):   {作家,send_failed,{错误,超时}}

当Celery工作人员重置连接时,就会发生错误。

我认为这是AMQP Heartbeat问题,因此我已将BROKER_HEARTBEAT = 15添加到我的Celery设置中,但它没有任何区别。

2 个答案:

答案 0 :(得分:3)

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

new State(state: "Issuable", updates: []).save(failOnError:true)
new State(state: "Holding", updates: []).save(failOnError:true)
new State(state: "In for repair", updates: []).save(failOnError:true)

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

CELERY_ACKS_LATE = True
CELERYD_PREFETCH_MULTIPLIER = 1

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

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

celery -A test worker -l info -Ofair

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

答案 1 :(得分:1)

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

我通过包含 broker_heartbeat=0

解决了这个问题
broker_pool_limit = None
task_acks_late = True
broker_heartbeat = 0
worker_prefetch_multiplier = 1