禁用Celery工作者的gossip、mingle和heartbeat会有什么后果?

47
禁用 Celery 的 gossip、mingle 和 heartbeat 会有什么影响?
为了减少发送到 CloudAMQP 的消息数量,以符合免费计划的要求,我决定遵循这些建议。因此,我使用了选项--without-gossip --without-mingle --without-heartbeat。自那以后,我默认使用这些选项来管理所有的 celery 项目,但我不确定是否存在任何我不知道的副作用。
请注意:
  • 我们现在转向使用 Redis broker,并没有太多关于发送到 broker 的限制
  • 我们有多个实例运行多个具有多个队列的 celery worker
4个回答

32

这是基础文档,并没有给我们太多信息。

心跳

与工人和代理(在您的情况下,代理是CloudAMQP)之间的通信相关。 请参见解释

使用--without-heartbeat选项,工作程序将不会发送心跳事件。

mingle

它只在启动时从其他工作程序请求“逻辑时钟”和“撤销任务”。

来自whatsnew-3.1

工人现在将尝试与同一群集中的其他工人同步。

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

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

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

还请参见文档

gossip

工人向所有其他工人发送事件,这目前用于“时钟同步”,但也可以在事件上编写自己的处理程序,例如on_node_join。请参阅文档

摘自whatsnew-3.1

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

这意味着一个工人知道其他工人正在做什么,并且可以检测他们是否离线。目前,这仅用于时钟同步,但未来有许多可能的增加和您可以编写已利用此功能的扩展。

一些想法包括共识协议,将任务重定向到最佳工人(基于资源使用或数据局部性),或在崩溃时重新启动工人。

我们认为,尽管这只是一个小添加,它却打开了很多惊人的可能性。

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


4
你能详细说明禁用心跳的应用后果吗?例如,如果禁用了心跳,工作者是否会检测到代理不可用?如果能,他们将如何检测到?CloudAMQP(https://www.cloudamqp.com/docs/celery.html)建议不需要使用心跳,因为“我们已经在所有RabbitMQ服务器上启用了低TCP keep-alive间隔,以便可以在TCP层而不是在应用程序层上检测到陈旧的连接。”这是CloudAMQP独有的还是任何AMQP连接到RabbitMQ代理的基本现实情况?谢谢! - user1847
这取决于您如何配置celery。如果您使用默认的c librabbitmq,我找不到使用的套接字配置。如果您使用python amqp库,则默认的套接字配置为TCP_KEEPALIVE=1(布尔值),TCP_KEEPIDLE=60(秒),TCP_KEEPINTVL=10(秒),TCP_KEEPCNT=9(计数),TCP_USER_TIMEOUT=1000(毫秒)。 - Trevor Boyd Smith
对于默认的c librabbitmq代码中的TCP keepalive设置,只有true是被设置的,其他三个参数都使用系统默认值。例如,在CentOS7上的默认参数为:TCP_KEEPIDLE=7200TCP_KEEPINTVL=75TCP_KEEPCNT=9。如果您的系统使用了7200秒的值,则建议启用Celery Worker心跳(或者在长时间空闲期间,您的连接可能会中断)。 - Trevor Boyd Smith
CloudAMQP的开发团队表示,他们已经将TCP keep idle间隔设置得比较低(可能为30至60秒),这可能会强制所有客户端在TCP层面上做出响应,并强制所有Celery用户具有相同的TCP keep间隔时间(即使客户端本来是7200秒)。但不幸的是,我并不是TCP或socket方面的专家,所以无法确定这样做是否可行。 - Trevor Boyd Smith
AWS Amazon MQ还建议使用--without-hearbeat运行Celery,但从文档中并不清楚他们是否真的使用了低TCP keepalive:https://docs.aws.amazon.com/amazon-mq/latest/developer-guide/best-practices-rabbitmq.html - fjsj

5
使用--without-mingle选项启动的Celery工作者,不会从其他工作者接收同步数据,特别是已撤销的任务。因此,如果您撤销一个任务,则所有当前正在运行的工作者都将收到该广播并将其存储在内存中,以便当其中一个工作者最终从队列中拾取该任务时,它将不会执行它。
但是,如果在已接收广播的工作者将任务出队之前,有一个新的工作者启动,则它不知道要撤销该任务。如果它最终拾取了该任务,那么该任务将被执行。如果您在动态缩放Celery工作者的环境中运行,则可能会看到这种行为。
参考链接:https://docs.celeryproject.org/en/stable/userguide/workers.html#persistent-revokes

4
我想知道是否使用--without-heartbeat参数会影响worker检测broker断开连接并尝试重新连接的能力。上面提到的文档只含糊地指出这些心跳在应用程序层而不是TCP/IP层起作用。好吧,我真正想知道的是删除这些消息是否会影响我的worker功能-特别是检测broker断开连接然后适当地尝试重新连接的能力。
我自己进行了一些快速测试,并发现使用传递了--without-heartbeat标志时,worker仍然能够非常快速地检测到broker断开连接(由我关闭RabbitMQ实例引起),并且它们在我重新启动RabbitMQ实例时成功地尝试重新连接到broker。因此,我的基本测试表明,心跳对于基本健康检查和功能不是必要的。那么,它们的目的是什么呢?对我来说不清楚,但它们似乎不影响worker的功能。

我认为你应该发布一个新的问题来解决这个问题。经纪人将在没有心跳事件的情况下重新连接,但心跳事件不仅仅是检查连接。它检查事件是否被发送和接收,这是一个更大的指标,表明应用程序正在按预期运行。而且你可能有一些使用案例需要使用它。比如当你有多个经纪人并且希望工作人员在事件开始下降时移动到新的经纪人。 - ofirule
1
完成,@ofirule!https://dev59.com/GMDqa4cB1Zd3GeqPYDKb - user1847

0
除了上面的答案之外,如果你使用flower仪表板,设置--without-heartbeat将会显示你的工作进程为“离线”。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接