在 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 开关)。因此,您仍然需要调度程序的额外进程。

至于监控,我建议只在您的本地机器或其他服务器上临时运行监控器。

【讨论】:

好吧,我确实将geventgunicorn 一起使用,这适用于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:一名工人同时执行任务?

celery multi 在heroku上崩溃

在 Heroku 上运行的 Celery beat 进程发送任务两次

在 Heroku 上部署 React 应用和 API 的最佳实践

Celery / Heroku - 使用 Heroku run python 在后台运行时,延迟()啥也不做

Heroku celery 后台任务