在 heroku 上运行 celery 的最佳实践
Posted
技术标签:
【中文标题】在 heroku 上运行 celery 的最佳实践【英文标题】:Best Practices for running celery on heroku 【发布时间】:2013-06-22 21:31:42 【问题描述】:假设我在我的 Procfile 中声明了以下进程
web: newrelic-admin run-program python manage.py run_gunicorn -b 0.0.0.0:$PORT -w 9 -k gevent --max-requests 250 --preload --timeout 240
scheduler: python manage.py celery worker -B -E --maxtasksperchild=1000
worker: python manage.py celery worker -E --maxtasksperchild=1000
celerymon: python manage.py celerymon -B 0.0.0.0 -P $PORT
我基本上必须运行我的主要 Web 进程的一些测功机。运行调度程序。运行几个工人。监控芹菜。单独使用托管的 AMQP 代理。
我已经尝试过 running multiple processes on a single dyno 的替代方案,但它似乎不能可靠地工作,而且无论如何我也不想在生产中使用它。
我发现运行所有这些的成本有点高,尤其是当我认为我可以在一个测功机上组合一些进程时。也许将调度程序与监控结合起来,或者将调度程序和工作程序一起运行。
除此之外,Heroku 只公开了 80 和 443 个端口,并且无法在同一个测功机上的多个端口上运行服务。
什么是优化流程和测功机使用的好策略?
如果运行 celerycam 会增加另一个 dyno 的成本,那么如何在 heroku 上监控 celery 任务?
【问题讨论】:
(免责声明:这不是一个解决方案)我建议看看 Heroku 的附加组件部分必须提供的非 Celery 解决方案,以及它们的基本调度程序。 Celery 感觉是一个全面的解决方案,但恕我直言,管理起来很痛苦。也看看 SQS。您可以使用 SQS 编写自己的解决方案,在少于 30 行代码的情况下在单个或多个测功机上运行(boto.readthedocs.org/en/latest/ref/sqs.html 使 SQS 变得非常简单)。 【参考方案1】:您可以考虑使用eventlet 来扩展您的工作池,而无需增加测功机的数量。
不幸的是,基于 eventlet 的工作人员不支持调度/节拍(-B 开关)。因此,您仍然需要调度程序的额外进程。
至于监控,我建议只在您的本地机器或其他服务器上临时运行监控器。
【讨论】:
好吧,我确实将gevent
与gunicorn
一起使用,这适用于web
进程。但是同样的东西不能真正用于运行 celery
单个 celery worker 可以通过 eventlet 提供并发。也许您错过了我答案中的链接?尽管如此,正如解释的那样,您至少需要 2 个进程,一个用于并发工作人员(使用 eventlet),一个用于调度。
我确实错过了链接。这确实使运行芹菜工人更加优化。虽然我仍然认为现在最好的替代方案是不要将 celery 与 Heroku 的进程模型一起使用并运行 Heroku 调度程序。
@dwightgunning 你能解释一下我如何从我的本地机器或其他服务器上运行 celerycam/cermymon 吗?
@CodeMonkeyB - 在此处查看 Celery Flower 的文档:docs.celeryproject.org/en/master/userguide/…以上是关于在 heroku 上运行 celery 的最佳实践的主要内容,如果未能解决你的问题,请参考以下文章
在 Heroku 上运行的 Celery beat 进程发送任务两次
在 Heroku 上部署 React 应用和 API 的最佳实践