Django Celery ConnectionError:错过了太多心跳



问题

如何解决来自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应用程序使用芹菜执行周期性后台任务
  • 在Heroku主持
  • 通过设置/celeybeat计划每15分钟运行一次的单个任务
  • 通过CloudAMQP插件处理消息
  • 进程运行者
    • web: newrelic-admin run-program gunicorn --workers=2 --worker-class=gevent someapp.wsgi:application
    • scheduler: 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

到目前为止我尝试了什么

  • 将错误与活动关联起来(似乎与用户的访问应用程序、调用的后台任务、应用程序空闲无关)
  • 谷歌搜索,直到我的手指麻木
  • 正在将程序包升级到最新版本
  • 不同级别的日志记录
  • 哨兵捕获异常(不会出现在哨兵中)
  • 在开发环境下无法在本地复制错误,只能在Heroku上进行生产

可能的相关信息

  • 我不确定这个错误第一次出现的确切时间(大约一个月前?)
  • 可能在某种程度上与以下变化有关(不要回忆之前的错误,但不能100%确定)
    • celery==3.0.13celery==3.0.14
    • amqplib->amqp
    • kombu==2.4.8kombu==2.5.4
  • 错误只出现在日志中(不会被NewRelic或getsentint.com发现)

这种情况多久发生一次?

在您的情况下,可能是心跳监测工作不正常。心跳支持是最近才引入的,所以可能存在错误。我不能在这里复制,所以我需要更多的数据来了解发生了什么

您可以通过设置BROKER_HEARTBEAT=0来禁用心跳。如果这是一个错误,那么工作程序应该运行良好,但它将无法运行以快速检测断开的连接。无法检测到连接丢失只是某些环境中的问题(通常由特定的路由器/防火墙配置引起)

相关内容

  • 没有找到相关文章

最新更新