我在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设置中,但它没有任何区别。
答案 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