从Heroku管理对Django的长时间运行请求

时间:2015-03-15 12:23:40

标签: python django heroku amazon-ec2

我正在开发一个分布式系统,我在heroku上安装了一个应用程序,根据安装在EC2 ubuntu实例上的django,从第二个“API”发出请求。在经历了很多混乱之后,我收到了很多503错误:

我查看了EC2 nginx日志:

SIGPIPE: writing to a closed pipe/socket/fd (probably the client disconnected) on request /i/ 

做一个:

$ heroku logs --tail 

给出

←[35m2015-03-15T01:31:24.778005+00:00 heroku[router]:←[0m at=error code=H12 desc="Request timeout" method=POST path="/i/"   host=myapp.herokuapp.com request_id=459d8925-194f-4d85-a6
ed-a1dc90fb01fb fwd="216.**.**.**" dyno=web.1 connect=1ms service=30004ms status=503 bytes=0

显然,任何需要超过30秒(https://devcenter.heroku.com/articles/limits#router)的heroku请求都会出现这些H12错误。不幸的是,我的ec2 django应用程序需要60秒才能返回响应。

从包括How to increase Heroku 30s h12 timeout在内的多个来源看来,我需要修改我的代码,以便heroku请求触发ec2 django应用程序的后台进程,然后立即返回响应。我之前没有在python / django中使用异步任务。处理这个问题的最简单/最好的方法是什么。

1 个答案:

答案 0 :(得分:1)

哈,你问过一个相当开放的问题......让我试着指出你正确的方向,而不是重写一堆已经写好的东西。

使用Django / Python时,芹菜的一个很好的标准是。有关使用的heroku详细信息,请参阅https://devcenter.heroku.com/articles/celery-heroku#deploying-on-heroku。完成初始设置后,只需使用" @ task"并使用" .delay()"调用异步任务即可。

你需要一个"支持商店"用于管理任务。 heroku指南将引导您完成redis。如果您的数据库未被充分利用且异步任务的速度非常小,那么您可能希望在生产中运行该数据库。否则,我找到了最便宜的解决方案而没有性能上的担忧就是Redis。

如果您对应用程序非常了解,请考虑使用Honcho(请参阅http://www.radekdostal.com/content/heroku-running-multiple-python-processes-single-dyno-using-honcho