【问题标题】:Handling long requests处理长请求
【发布时间】: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),或者有更好的解决方案来建议我吗?

谢谢!

【问题讨论】:

标签: django nginx request timeout celery


【解决方案1】:

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

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

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

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

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

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

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

【讨论】:

  • 感谢您的确认,一旦实施,我会回到这里回答我的问题 :)
  • 所以,我有点困惑。为什么有2台服务器?我的意思是,如果第一台服务器要处理 dJango 请求,那么下一台服务器也必须处理类似的事情。那么为什么不直接使用 dJango 服务器呢?
  • 当然,您可以在同一台机器上拥有一切。这只是在您的应用程序流量增加时分配工作负载的问题。较长的计算过程可能会影响 http 请求的性能(您的应用程序性能),因此将工作委派给其他机器可能会改善它。
猜你喜欢
  • 2017-02-05
  • 2020-10-17
  • 1970-01-01
  • 2020-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多