【发布时间】:2015-09-22 20:27:21
【问题描述】:
我正在处理对 django 应用程序(nginx 反向代理、mysql db、celery-rabbitMQ-redis 集)的长请求,并且对我应该应用的解决方案有一些疑问:
功能:该应用程序的一项功能允许用户将数千个对象从一个系统迁移到另一个系统。每个迁移都记录到一个数据库中,并且为用户提供了以 csv 格式获取迁移历史记录的可能性:哪些对象已被迁移,哪些状态(成功、错误、...)
为了获取历史记录,将一个 get 请求发送到 django 视图,该视图在序列化并呈现为 csv 之后返回下载响应。
问题:大量对象(例如 160 000)的序列化和渲染过程相当长,并且请求超时。
由于之前的搜索,我正在考虑/找到的一些解决方案是:
- 增加超时前的时间:很简单,但我到处都看到这是一个全局 nginx 设置,会影响服务器上的每个请求。
- 使用由 celery 处理的异步任务:概念是向服务器发出初始请求,服务器将启动 celery 的序列化和渲染任务,并给客户端一个特殊的 httpresponse。然后客户端会定期询问服务器工作是否完成,服务器会在处理结束时传递历史记录。我喜欢这个,但我不确定如何在技术上实现它。
- 在服务器上创建和临时存储 csv 文件,并为用户提供访问和下载的方法。我不是那个的忠实粉丝。
所以我的问题是:有人已经遇到过类似的问题吗?您对解决方案的技术实施有什么建议(#2),或者有更好的解决方案来建议我吗?
谢谢!
【问题讨论】:
-
执行由 celery 处理的异步任务将是最好的解决方案,这是一个与我的回答类似的问题:stackoverflow.com/questions/32583897/… 您也可以通过在 python 中使用多线程而不使用 celery,但它更复杂。
-
您还可以尝试
StreamingHttpResponse(虽然从未尝试过):docs.djangoproject.com/en/1.8/ref/request-response/…
标签: django nginx request timeout celery