关于python:从Heroku管理对Django的长时间运行请求

Managing a long running request to Django from Heroku

我正在开发一个分布式系统,其中一个应用程序安装在Heroku上,从另一个基于Django的"API"发出请求,该应用程序安装在EC2 Ubuntu实例上。在昨天一片混乱之后,我发现了503个错误:

我查看了EC2 nginx日志,发现:

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

做某事:

1
$ heroku logs --tail

给予

1
2
[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

显然,这些h12错误发生在任何Heroku请求上,需要30秒以上(https://devcenter.heroku.com/articles/limits router)。不幸的是,我的ec2-django应用程序需要60秒来返回响应。

从多个来源,包括如何增加Heroku 30s H12超时,我似乎需要修改我的代码,以便Heroku请求触发EC2 Django应用程序上的后台进程,然后返回即时响应。我以前没有在python/django中处理过异步任务。处理这个问题最简单/最好的方法是什么?


哈,你问了一个非常开放的问题……与其重写一些已经写过的东西,不如让我试着给你指出正确的方向。

使用django/python时,一个很好的标准就是芹菜。参见https://devcenter.heroku.com/articles/celery heroku部署在heroku上了解heroku的使用细节。一旦你得到了初始设置,它就像用"@task"装饰你的异步任务并用".delay()"调用它们一样简单。

您将需要一个用于管理任务的"后备存储器"。Heroku指南让你通过Redis。如果您有一个未充分利用的数据库,并且异步任务的速率非常小,那么您可能需要在生产环境中运行它。否则,我发现最便宜的解决方案是Redis,它不需要担心性能。

如果你真的对你的应用很感兴趣,考虑使用Honcho(见http://www.radekdostal.com/content/heroku-running-multiple-python-processes-single-dyno-using-honcho)