首页 > 解决方案 > 芹菜:禁用工人之间的心跳

问题描述

我正在使用 Redis 后端和代理在 Celery 中进行数据处理例程。许多工人(约 200 人)与经纪人交互以获取任务并执行这些任务。然而,我的工作人员都在互相发送心跳信号,这会在他们的日志中填充各种像这样的杂乱无章的东西:

[2018-05-13 15:38:00,737: INFO/MainProcess] missed heartbeat from celery@d12chas387.crc.nd.edu
[2018-05-13 15:38:00,737: INFO/MainProcess] missed heartbeat from celery@d12chas530.crc.nd.edu
[2018-05-13 15:38:00,737: INFO/MainProcess] missed heartbeat from celery@d12chas531.crc.nd.edu
[2018-05-13 15:38:00,738: INFO/MainProcess] missed heartbeat from celery@d12chas351.crc.nd.edu
[2018-05-13 15:38:00,738: INFO/MainProcess] missed heartbeat from celery@d12chas515.crc.nd.edu
[2018-05-13 15:38:00,739: INFO/MainProcess] missed heartbeat from celery@d12chas492.crc.nd.edu

工作人员不应该直接相互交流,他们都应该从经纪人那里获得他们需要的信息。是否可以禁用工作节点之间的心跳?如果是这样,出于某种我还没有看到的原因,这是一个坏主意吗?

标签: pythonrediscelerymessage-passing

解决方案


您可以尝试使用--without-gossip运行您的工作人员以防止这种情况发生。从 Celery 3.1 开始,worker 被动订阅其他 worker 事件,例如心跳。

添加了 Gossip 以允许 celery 用户利用工作人员通信,例如将任务重新路由给最佳工作人员,但如果工作人员没有理由进行通信,则可以禁用此功能。你可以在这里阅读更多关于什么是工人八卦/为什么引入它:Celery 3.1 What's New

您还可以添加--without-mingle选项以在启动时禁用工作同步。

此外,这个问题似乎相关:芹菜错过心跳(on_node_lost)


推荐阅读