禁用八卦,混杂和心跳对芹菜工作者有什么后果?

时间:2019-03-19 20:06:29

标签: python redis celery worker cloudamqp

禁用八卦,混杂和心跳对我的芹菜工人有什么影响?

为了减少发送到CloudAMQP的消息数量,使其不超出免费计划,我决定遵循these recommendations。因此,我使用了选项--without-gossip --without-mingle --without-heartbeat。从那时起,默认情况下,我一直在所有芹菜项目中使用这些选项,但是我不确定是否有我不知道的副作用。

请注意:

  • 我们现在已迁移到Redis代理,并且对发送到代理的邮件数量没有太多限制
  • 我们有多个运行多个芹菜工人且有多个队列的实例

3 个答案:

答案 0 :(得分:2)

这是基础documentation,没有给我们太多信息

心跳

与工作人员和代理(在您的情况下,代理为CloudAMQP)之间的通信有关。 参见explanation

使用on_node_join,工作人员将不会发送心跳事件

混合

启动时,它仅要求其他工作人员提供“逻辑时钟”和“已撤销的任务”。

取自whatsnew-3.1

  

工作者现在将尝试与同一集群中的其他工作者进行同步。

     

同步数据当前包括已撤销的任务和逻辑时钟。

     

这仅在启动时发生,并且导致一秒钟的启动延迟来收集其他工作人员的广播响应。

     

您可以使用--without-mingle参数禁用此引导步骤。

另请参见docs

闲话

工作人员将事件发送给所有其他工作人员,当前用于“时钟同步”,但是也可以为事件编写自己的处理程序,例如Configuration,请参见docs

取自whatsnew-3.1

  

工人现在正在被动地订阅与工人有关的事件,例如心跳。

     

这意味着一个工作人员知道其他工作人员在做什么,并且可以检测他们是否下线。当前,此功能仅用于时钟同步,但将来有很多添加的可能性,您可以编写扩展来利用此功能。

     

一些想法包括共识协议,将任务重新路由到最佳工作人员(基于资源使用情况或数据位置)或在工作人员崩溃时重新启动。

     

我们相信,尽管这只是一个很小的补充,但它带来了惊人的可能性。

     

您可以使用--without-gossip参数禁用此引导步骤。

答案 1 :(得分:2)

Celery工人使用--without-mingle选项启动,如上文@ofirule所述,将不会从其他工人(尤其是已撤销的任务)接收同步数据。因此,如果您撤消一项任务,则当前正在运行的所有工作人员都将接收到该广播,并将其存储在内存中,以便当其中一个最终从队列中提取任务时,它将不会执行:

https://docs.celeryproject.org/en/stable/userguide/workers.html#persistent-revokes

但是,如果新工作人员在接收广播的工作人员将任务出队之前启动了该工作,则它不知道要撤销该任务。如果最终选择了任务,则将执行任务。如果您在不断动态扩展和扩展芹菜工作者的环境中运行,您将看到此行为。

答案 2 :(得分:0)

我想知道 --without-heartbeat 标志是否会影响工作人员检测代理断开连接和尝试重新连接的能力。上面引用的文档只是含糊地提到了这些在应用层而不是 TCP/IP 层起作用的心跳。好的——我真正想知道的是,消除这些消息是否会影响我的工作人员的工作能力——特别是检测代理断开连接,然后尝试适当地重新连接?

我自己进行了一些快速测试,发现通过 --without-heartbeat 标志后,工作人员仍然很快检测到代理断开连接(由我关闭 RabbitMQ 实例启动),并且他们尝试重新连接到代理并当我重新启动 RabbitMQ 实例时成功执行此操作。因此,我的基本测试表明,基本健康检查和功能不需要心跳。无论如何,他们有什么意义?我不清楚,但它们似乎对工作器功能没有影响。