【发布时间】:2013-01-26 20:27:11
【问题描述】:
问题
如何解决 Celery 中的ConnectionError: Too many heartbeats missed?
示例错误
[2013-02-11 15:15:38,513: ERROR/MainProcess] Error in timer: ConnectionError('Too many heartbeats missed', None, None, None, '')
Traceback (most recent call last):
File "/app/.heroku/python/lib/python2.7/site-packages/celery/utils/timer2.py", line 97, in apply_entry
entry()
File "/app/.heroku/python/lib/python2.7/site-packages/celery/utils/timer2.py", line 51, in __call__
return self.fun(*self.args, **self.kwargs)
File "/app/.heroku/python/lib/python2.7/site-packages/celery/utils/timer2.py", line 153, in _reschedules
return fun(*args, **kwargs)
File "/app/.heroku/python/lib/python2.7/site-packages/kombu/connection.py", line 265, in heartbeat_check
return self.transport.heartbeat_check(self.connection, rate=rate)
File "/app/.heroku/python/lib/python2.7/site-packages/kombu/transport/pyamqp.py", line 134, in heartbeat_check
return connection.heartbeat_tick(rate=rate)
File "/app/.heroku/python/lib/python2.7/site-packages/amqp/connection.py", line 837, in heartbeat_tick
raise ConnectionError('Too many heartbeats missed')
ConnectionError: Too many heartbeats missed
应用概览
- Django 应用使用 celery 执行周期性后台任务
- 在 Heroku 上托管
- 通过设置/celerybeat 计划每 15 分钟运行一次的单个任务
- 通过 CloudAMQP 插件处理消息
- 运行的进程
web: newrelic-admin run-program gunicorn --workers=2 --worker-class=gevent someapp.wsgi:applicationscheduler: newrelic-admin run-program python manage.py celery worker -B -E --maxtasksperchild=1000 --loglevel=WARNING
软件包版本
就是我认为相关的:
Django==1.4.3
amqp==1.0.8
billiard==2.7.3.20
celery==3.0.14
gevent==0.13.8
greenlet==0.4.0
kombu==2.5.6
raven==3.1.10
到目前为止我已经尝试过什么
- 将错误与活动相关联(似乎与用户访问应用、调用后台任务、应用闲置无关)
- 谷歌搜索/搜索,直到我的手指麻木
- 将软件包升级到最新版本
- 各种级别的日志记录
- 使用 Sentry 捕获异常(未出现在 sentry 中)
- 在开发环境下无法在本地重现错误,只能在 Heroku 上的生产环境中重现
可能的相关信息
- 我不确定这个错误第一次出现的确切时间(~ 一个月前?)
- 可能在某种程度上与以下更改有关(在此之前不要回忆错误,但不是 100% 肯定)
-
celery==3.0.13到celery==3.0.14 -
amqplib->amqp -
kombu==2.4.8到kombu==2.5.4
-
- 错误仅出现在日志中(New Relic 或 getsentry.com 不会发现)
【问题讨论】:
-
我们有同样的问题。但遗憾的是直到现在还没有解决方案:(
-
下面的答案为我解决了这个问题。尝试设置
BROKER_HEARTBEAT = 0。祝你好运! -
我们已经看到这个错误,它与您的 heroku 设置非常相似。我想知道是否有人向 CloudAMQP 报告过?无论如何,我没有看到任何实际问题,所以我基本上忽略了它。
-
我没有向 CloudAMQP 报告。我认为问题出在
celery或amqp而不是他们的服务(我很可能是错的)。不幸的是,这些错误使我的 CloudAMQP 使用量猛增。也许我的设置不太理想。 -
是的,我刚刚将代理切换到 Redis,因此我可以使用相同的代理和结果后端,并且在这方面取得了很好的成功。
标签: python django heroku celery django-celery