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

时间:2013-06-25 21:56:00

标签: django heroku celery amqp

假设我在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

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

我尝试了running multiple processes on a single dyno的替代方案,但它似乎无法可靠地工作,反正不是我想在制作中使用的东西。

我发现运行这一切的成本有点令人望而却步,特别是当我认为我可以在一个dyno上将某些进程聚集在一起时。也许可以将调度程序与监视相结合,或者将调度程序和worker一起运行。

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

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

另外,如果运行celerycam为你的成本添加另一个dyno,如何监控heroku上的celery任务呢?

1 个答案:

答案 0 :(得分:2)

您可以使用eventlet来扩展工作池,而不会增加动态数据。

不幸的是,基于事件的工作者不支持调度/节拍(-B开关)。因此,您仍需要为调度程序提供额外的过程。

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