禁用 celery workers 的 gossip、mingle 和 heartbeat 有什么后果?

What are the consequences of disabling gossip, mingle and heartbeat for celery workers?

禁用 gossip、mingle 和 heartbeat 对我的 celery worker 有什么影响?

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

请注意:

这是基础 documentation,没有提供太多信息

心跳

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

使用--without-heartbeat worker 不会发送心跳事件

混合

它只在启动时向其他工作人员请求“逻辑时钟”和“撤销的任务”。

取自whatsnew-3.1

The worker will now attempt to synchronize with other workers in the same cluster.

Synchronized data currently includes revoked tasks and logical clock.

This only happens at startup and causes a one second startup delay to collect broadcast responses from other workers.

You can disable this bootstep using the --without-mingle argument.

另见 docs

八卦

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

取自whatsnew-3.1

Workers are now passively subscribing to worker related events like heartbeats.

This means that a worker knows what other workers are doing and can detect if they go offline. Currently this is only used for clock synchronization, but there are many possibilities for future additions and you can write extensions that take advantage of this already.

Some ideas include consensus protocols, reroute task to best worker (based on resource usage or data locality) or restarting workers when they crash.

We believe that although this is a small addition, it opens amazing possibilities.

You can disable this bootstep using the --without-gossip argument.

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

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

但是,如果一个新的 worker 在该任务被接收广播的 worker 出列之前启动,它不知道要撤销该任务。如果它最终选择了任务,则执行该任务。如果您 运行 在一个不断动态地缩减 celery worker 的环境中,您将看到这种行为。

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

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