在heroku上运行芹菜的最佳实践

Pra*_*kar 14 django heroku amqp celery

假设我在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
Run Code Online (Sandbox Code Playgroud)

我基本上必须运行一些主要网络流程的dynos.运行调度程序.跑几个工人.监控芹菜.单独使用托管的AMQP代理.

我尝试过在一个dyno上运行多个进程的替代方案,但它似乎不能可靠地工作,反正不是我想在生产中使用的东西.

我发现运行所有这些的成本有点过高,特别是当我认为我可以在一个dyno上将一些进程联合起来时.也许将调度程序与监视相结合,或者将调度程序和worker一起运行.

除此之外,Heroku只暴露了80和443个端口,并且无法在同一个dyno上的多个端口上运行服务.

优化流程和动态使用的优秀策略是什么?

另外,如果运行celerycam为你的成本增加另一个dyno,那么如何监控heroku上的芹菜任务呢?

Dwi*_*ing 2

您可以考虑使用eventlet来扩展您的工作池,而不增加 dyno 的数量。

不幸的是,基于 eventlet 的工作线程不支持调度/节拍(-B 开关)。因此,您仍然需要一个额外的调度程序进程。

至于监控,我建议仅从本地计算机或另一台服务器临时运行监控器。