如何监控芹菜中的队列健康状况

Gor*_*oro 12 python rabbitmq celery django-celery

我有以下设置:

  • 与100名工人的通用工作者水池
  • 高度优先的工人池,有50名工人
  • 我使用了如此庞大的数字,因为我的任务大部分时间都花费很长时间等待I/O(执行可能需要20秒才能响应的HTTP请求)
  • 使用RabbitMQ作为代理
  • 我使用celery'd github 的init.d 脚本将celeryd 设置为deamon ,具有以下参数: CELERYD_OPTS="--time-limit=600 -c:low_p 100 -c:high_p 50 -Q:low_p low_priority_queue_name -Q:high_p high_priority_queue_name"

我的问题是,有时候队列似乎"备份"......就是它会停止消耗任务.似乎有这样的情景:

  • 代理中存在"未确认"消息的缓慢堆积,尽管celery inspect active这表明并非所有工作者都用完了 - 也就是说,我只会看到一些活动任务
  • 队列将停止消耗新任务,而不会产生累积.
  • 当处于"死"状态时,strace在工作进程上使用不会返回任何内容......工作者完全没有活动

我将不胜感激任何信息或指示:

  • 我怎么调试它.我可以strace用来查看工作进程正在做什么,但到目前为止,这对于告诉我工人正在挂起是有用的
  • 我如何监控这一点,并可能进行自动恢复.有管理芹菜许多工具(flowerevents,但他们是在实时兼具优良-但没有任何自动化监控/报警功能).我最好用supervisord编写自己的监控工具吗?

另外,我从django-celery开始我的任务

Art*_*nin 3

@goro,如果您向外部服务发出请求,您应该尝试gevent 或 eventlet池实现,而不是生成 100500 个工作人员。我也遇到了问题,当 celery 工作人员停止消耗任务时,这是由celery+gevent+sentry(raven)组合的错误引起的。

我对 Celery 发现的一件事是,如果一切都正确的话,它可以在没有任何监控的情况下正常工作(目前我每天执行 > 50M 的任务),但如果不是这样,监控不会对你有太大帮助。Celery 中的“灾难恢复”有点棘手,并非所有事情都会按您的预期进行:(

您应该在较小的和平上打破您的解决方案,可能会在不同队列之间分离一些任务。在某些时候,您会发现导致问题的代码片段。