芹菜心跳未工作

7

我已经在Celery设置中设置了心跳:

BROKER_HEARTBEAT = 10

我也在RabbitMQ配置中设置了这个配置值:
'heartbeat' => '10',

但是不知何故,心跳仍然被禁用:
ubuntu@sync1:~$ sudo rabbitmqctl list_connections name timeout
Listing connections ...
some_address:37781 -> other_address:5672    0
some_address:37782 -> other_address:5672    0
...done.

你有什么想法我做错了什么吗?

更新:

现在我得到:

ubuntu@sync1:/etc/puppet$ sudo rabbitmqctl list_connections name timeout
Listing connections ...
some_address:41281 -> other_address:5672    10
some_address:41282 -> other_address:5672    10
some_address:41562 -> other_address:5672    0
some_address:41563 -> other_address:5672    0
some_address:41564 -> other_address:5672    0
some_address:41565 -> other_address:5672    0
some_address:41566 -> other_address:5672    0
some_address:41567 -> other_address:5672    0
some_address:41568 -> other_address:5672    0
...done.

我有三台服务器:

  • RabbitMQ代理
  • RESTful API服务器
  • 远程工作服务器

看起来,远程化的Celery工作者可以正确地发送心跳。但是使用Celery远程处理任务的RESTful API服务器由于某种原因没有使用心跳。

2个回答

8
Celery worker 的心跳是应用级别的心跳,而不是 AMQP 协议的心跳。每个 worker 定期向 BROKER 中的 "celeryev" 事件交换发送心跳事件消息。心跳事件被转发回 worker,以便 worker 可以知道 BROKER 的健康状态。如果丢失的心跳次数超过阈值,则 worker 可以执行一些重新连接到 BROKER 的操作。
有关详情,请查看此 页面。BROKER_FAILOVER_STRATEGY 部分描述了在从 BROKER 中断开连接时可以执行的操作。

celery worker 还应该执行“真正”的心跳。您可以在代码中看到这一点:https://github.com/celery/celery/blob/3.1/celery/worker/loops.py#L36 我没有找到任何迹象表明心跳是通过“celeryev”队列执行的,但是如果启用了心跳,则具有这些消息会保持连接处于“活动”状态。 - odedfos
很高兴知道celery支持这个功能。请在此处检查心跳代码:https://github.com/celery/celery/blob/a3c377474ab1109a26de5169066a4fae0d30524b/celery/worker/consumer/heart.py 心跳计时器使用事件分发器发送“应用程序级别”的心跳事件。 - Houcheng
事件交换是“celeryev”。这在event.py中定义:https://github.com/celery/celery/blob/a3c377474ab1109a26de5169066a4fae0d30524b/celery/events/event.py - Houcheng

4
Celery worker支持AMQP心跳。配置项BROKER_HEARTBEAT用于定义AMQP客户端(celery worker)的心跳间隔。我们可以在这里找到有关BROKER_HEARTBEAT的描述 Celery Doc
心跳不起作用的可能原因:
  1. 使用错误的传输方式,例如'librabbitmq' 正如Celery文档所述,只有'pyamqp'传输支持BROKER_HEARTBEAT。 我们需要检查是否安装了librabbitmq软件包, 或者我们可以在代理人URL中使用'pyamqp'传输:'pyamqp://userid:password@hostname:port/virtual_host'而不是'amqp://userid:password@hostname:port/virtual_host'

  2. 启动后三个心跳间隔期间未向Celery工作者发送任何事件 在此处检查代码以查看心跳如何工作! 在工作者启动期间将调用drain_events,在此处查看代码! 如果没有向Celery工作者发送任何事件,则不会调用connection.heartbeat_check

顺便提一下,connection.heartbeat_check这里定义!
希望能帮助遇到心跳问题的人。

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