处理长请求



我正在对django应用程序(nginx反向代理,mysql db, celery-rabbitMQ-redis set)进行长请求,并对我应该应用的解决方案有一些疑问:

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

为了获取历史,一个get请求被发送到django视图,在序列化并渲染成csv后,它返回下载响应。

问题:序列化和渲染过程,对于一个大的对象集合(例如160000)是相当长的和请求超时。

通过之前的搜索,我正在考虑/找到的一些解决方案是:

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

所以我的问题是:有人遇到过类似的问题吗?对于解决方案(#2)的技术实现,你有什么建议吗?或者有更好的解决方案给我吗?

Thqnks !

显然你应该使用芹菜+ RabbitMQ/REDIS。如果你看一下文档,设置起来并不难。

第一个问题是使用RabbitMQ还是Redis。关于这一点有很多问题,并提供了很好的利弊信息。

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

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

您在芹菜上设置的一件事是可用的工人(并发处理单元)的数量。所以你的机器的核数很重要。

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

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

相关内容

  • 没有找到相关文章

最新更新