首页 文章

Celery和RabbitMQ超时和连接重置

提问于
浏览
3

我'm using RabbitMQ 3.6.0 and Celery 3.1.20 on a Windows 10 machine in a Django application. Everything is running on the same computer. I'已将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)=错误报告==== 10月2日 - 2016 :: 22:17:14 ===关闭AMQP连接<0.247.0>(127.0.0.1:55372 - > 127.0.0.1:5672):{writer,send_failed,{error,timeout}}

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

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

1 回答

  • 3

    我在Windows上遇到了与Celery类似的问题,其中长期运行的任务是并发= 1 . 以下配置最终对我有用:

    CELERY_ACKS_LATE = True
    CELERYD_PREFETCH_MULTIPLIER = 1
    

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

    celery -A test worker -l info -Ofair
    

    在我有限的理解中,CELERYD_PREFETCH_MULTIPLIER设置了特定Celery工作队列中的消息数 . 默认情况下,它设置为4.如果将其设置为1,则每个工作程序将只消耗一条消息并在消耗另一条消息之前完成任务 . 我遇到了长时间运行任务的问题,因为与RabbitMQ的连接在长任务中间一直丢失,但如果任何其他消息/任务在芹菜队列中等待,则重新尝试该任务 .

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

    CELERYD_CONCURRENCY = 1
    

    将并发性设置为1对我来说是有意义的,因为我有长时间运行的任务,需要大量的RAM,所以他们每个人都需要单独运行 .

相关问题