Django Celery ConnectionError:错过了太多心跳

Posted

技术标签:

【中文标题】Django Celery ConnectionError:错过了太多心跳【英文标题】:Django Celery ConnectionError: Too many heartbeats missed 【发布时间】: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: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

到目前为止我已经尝试过什么

将错误与活动相关联(似乎与用户访问应用、调用后台任务、应用闲置无关) 谷歌搜索/搜索,直到我的手指麻木 将软件包升级到最新版本 各种级别的日志记录 使用 Sentry 捕获异常(未出现在 sentry 中) 在开发环境下无法在本地重现错误,只能在 Heroku 上的生产环境中重现

可能的相关信息

我不确定这个错误第一次出现的确切时间(~ 一个月前?) 可能在某种程度上与以下更改有关(在此之前不要回忆错误,但不是 100% 肯定) celery==3.0.13celery==3.0.14 amqplib -> amqp kombu==2.4.8kombu==2.5.4 错误仅出现在日志中(New Relic 或 getsentry.com 不会发现)

【问题讨论】:

我们有同样的问题。但遗憾的是直到现在还没有解决方案:( 下面的答案为我解决了这个问题。尝试设置BROKER_HEARTBEAT = 0。祝你好运! 我们已经看到这个错误,它与您的 heroku 设置非常相似。我想知道是否有人向 CloudAMQP 报告过?无论如何,我没有看到任何实际问题,所以我基本上忽略了它。 我没有向 CloudAMQP 报告。我认为问题出在celeryamqp 而不是他们的服务(我很可能是错的)。不幸的是,这些错误使我的 CloudAMQP 使用量猛增。也许我的设置不太理想。 是的,我刚刚将代理切换到 Redis,因此我可以使用相同的代理和结果后端,并且在这方面取得了很好的成功。 【参考方案1】:

多久发生一次?

在您的情况下,心跳监控可能无法正常工作。 心跳支持是最近才引入的,因此可能存在错误。 我无法在此处重现此内容,因此我需要更多数据来了解发生了什么。

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

【讨论】:

多久一次:奇怪的变化;错误之间的间隔为 20 分钟到两个小时。我已经设置了BROKER_HEARTBEAT = 0 并将报告回来。非常感谢您的宝贵时间! 设置BROKER_HEARTBEAT = 0并等待24小时后,我再也没有看到这个错误。我不确定这个错误是如何/为什么发生的,但这阻止了它的发生。谢谢! @asksol,当您说“无法检测到连接丢失只是在某些环境中的问题”时,这是否意味着可以安全地禁用心跳?我一直有完全相同的问题。我在笔记本电脑上运行 celery 3.0.11,但没有发现问题。我们在我们的服务器上运行 3.0.12,我们在那里看到了这个问题。 您可以安全地禁用它。如果代理无法检测到连接丢失,唯一会发生的情况是消息释放和重新传递需要更长的时间,但不会丢失数据。

以上是关于Django Celery ConnectionError:错过了太多心跳的主要内容,如果未能解决你的问题,请参考以下文章

django+django-celery+celery的整合实战

django + celery - 如何在我的 django 应用程序中为 celery 设置 crontab 计划?

django celery使用

django+celery实现异步任务

不同服务器上的 Django 和 celery,一旦任务完成,celery 能够向 django 发送回调

django+celery配置(定时任务)