我正在处理对django应用程序的长请求(nginx反向代理,mysql数据库,celery-rabbitMQ-redis设置)并且对我应该应用的解决方案有一些疑问:
功能:该应用的一项功能允许用户将数千个对象从一个系统迁移到另一个系统。每次迁移都会记录到数据库中,并且为用户提供了以csv格式获取迁移历史记录的可能性:迁移了哪些对象,状态(成功,错误等)
要获取历史记录,请将get请求发送到django视图,该视图在序列化并呈现到csv后返回下载响应。
问题:对于大量对象(例如160 000)的序列化和渲染过程非常长,请求超时。
由于以前的搜索,我正在思考/找到的一些解决方案是:
所以我的问题是:有没有人遇到过类似的问题?您是否对解决方案的技术实施提出了建议(#2),或建议我提出更好的解决方案?
Thqnks!
答案 0 :(得分:2)
显然你应该使用Celery + RabbitMQ / REDIS。如果您查看文档并不难设置。
第一个问题是是否使用RabbitMQ或Redis。关于这方面有许多有关这方面的问题,并提供有关利弊的良好信息。
django中的实现非常简单。您可以使用celery任务(使用@task属性)包装django函数,它将变为异步,因此这是最简单的部分。
我在项目中看到的问题是处理http流量的服务器是运行长流程的服务器。即使芹菜在后台运行,这也会影响性能和用户体验。当然,这取决于您在该计算机上预期的流量以及可以同时运行的迁移量。
您在Celery上设置的一项事项是可用的工作人员数(并发处理单位)。因此,机器中的核心数量很重要。
如果您需要快速处理http调用,我建议将迁移过程委派给另一台计算机。芹菜/ REDIS可以这样配置。假设您有2台服务器。一个人只处理正常的django调用(没有celery)并在另一个服务器(实际运行迁移过程的人)上触发芹菜任务。两台服务器都可以连接到同一个数据库。 但这只是基础架构优化,您可能不需要它。
我希望这能回答你的问题。如果您有特定的芹菜问题,最好再创建一个问题。