gpt4 book ai didi

django - 处理长请求

转载 作者:行者123 更新时间:2023-12-04 16:48:34 24 4
gpt4 key购买 nike

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

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

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

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

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

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

所以我的问题是:有没有人遇到过类似的问题?您对解决方案 (#2) 的技术实现有何建议,或向我推荐更好的解决方案?

谢谢!

最佳答案

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

第一个问题是用RabbitMQ还是Redis。有很多关于此的问题以及关于利弊的良好信息。

django 中的实现非常简单。你可以用 celery 任务(使用@task 属性)包装 django 函数,它会变成异步的,所以这是简单的部分。

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

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

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

我希望这能回答您的问题。如果您有特定的 Celery 问题,最好提出另一个问题。

关于django - 处理长请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32726248/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com