处理长请求

时间:2015-09-22 20:27:21

标签: django nginx request timeout celery

我正在处理对django应用程序的长请求(nginx反向代理,mysql数据库,celery-rabbitMQ-redis设置)并且对我应该应用的解决方案有一些疑问:

功能:该应用的一项功能允许用户将数千个对象从一个系统迁移到另一个系统。每次迁移都会记录到数据库中,并且为用户提供了以csv格式获取迁移历史记录的可能性:迁移了哪些对象,状态(成功,错误等)

要获取历史记录,请将get请求发送到django视图,该视图在序列化并呈现到csv后返回下载响应。

问题:对于大量对象(例如160 000)的序列化和渲染过程非常长,请求超时。

由于以前的搜索,我正在思考/找到的一些解决方案是:

  • 增加超时前的时间:简单,但我到处都看到这是一个全局nginx设置,会影响服务器上的每个请求。
  • 使用由celery处理的异步任务:概念是向服务器发出初始请求,该服务器将使用celery启动序列化和呈现任务,并向客户端提供特殊的httpresponse。然后,客户端会定期询问服务器是否完成了作业,服务器将在处理结束时提供历史记录。我喜欢这个,但我不确定如何在技术上实现它。
  • 在服务器上创建并临时存储csv文件,并为用户提供访问它的方法。下载它。我不是那个人的忠实粉丝。

所以我的问题是:有没有人遇到过类似的问题?您是否对解决方案的技术实施提出了建议(#2),或建议我提出更好的解决方案?

Thqnks!

1 个答案:

答案 0 :(得分:2)

显然你应该使用Celery + RabbitMQ / REDIS。如果您查看文档并不难设置。

第一个问题是是否使用RabbitMQ或Redis。关于这方面有许多有关这方面的问题,并提供有关利弊的良好信息。

django中的实现非常简单。您可以使用celery任务(使用@task属性)包装django函数,它将变为异步,因此这是最简单的部分。

我在项目中看到的问题是处理http流量的服务器是运行长流程的服务器。即使芹菜在后台运行,这也会影响性能和用户体验。当然,这取决于您在该计算机上预期的流量以及可以同时运行的迁移量。

您在Celery上设置的一项事项是可用的工作人员数(并发处理单位)。因此,机器中的核心数量很重要。

如果您需要快速处理http调用,我建议将迁​​移过程委派给另一台计算机。芹菜/ REDIS可以这样配置。假设您有2台服务器。一个人只处理正常的django调用(没有celery)并在另一个服务器(实际运行迁移过程的人)上触发芹菜任务。两台服务器都可以连接到同一个数据库。 但这只是基础架构优化,您可能不需要它。

我希望这能回答你的问题。如果您有特定的芹菜问题,最好再创建一个问题。