繁体   English   中英

批量生成http响应

[英]Batching generation of http responses

我正在尝试为以下情况找到一种体系结构。 我正在构建一个REST服务,该服务执行一些可以快速批量计算的计算。 假设计算1个“项目”需要50毫秒,计算100个“项目”需要60毫秒。

但是,客户的性质是一次只需要处理一项。 因此,如果我有100个并发客户端,并且编写了典型的请求处理程序来发送一项并生成响应,则最终将使用5000ms,但我知道我可以在60ms内计算出相同的值。

我试图找到一种在这种情况下运行良好的体系结构。 即,我希望有一些东西可以合并来自许多独立请求的数据,进行批处理,并为每个客户端生成等效的响应。

如果您感到好奇,那么所涉及的服务是基于python + django + DRF的,但是我很好奇这里适用的是哪种架构解决方案/模式,以及是否有解决此问题的方法已经可用。

最初,您可以想到一个反向代理来检测所有特定于模式的查询,收集所有这些查询,然后通过HTTP 1.1 管道将其发送到您的应用程序中(流水线是一种互相发送大量查询并接收所有HTTP的方式。最后以相同的顺序回复,而无需在每次查询后都等待回复)。

但:

  1. 流水线很难做好
  2. 您将不得不编写反向代理的代码,因为我不知道这样做的方法
  3. 管道中的一个缓慢响应会阻止所有其他响应
  4. 您需要一台能够对您的应用程序语言进行多次查询的http服务器,如果未在应用程序中直接对该http服务器进行编码,则不会发生这种情况,因为通常使http只对一个查询起作用(例如您永远不会在其中收到2个查询)一个PHP环境,即使连接包含2个查询,您也会收到第一个,发送响应,然后接收下一个。

因此,好主意是在应用程序端执行此操作 您可以识别匹配的查询,然后等待一小段时间(10毫秒?)以查看是否还有其他查询传入。 您将需要一种在此处的多个并行工作器之间进行通信的方法(例如您有50个应用程序工作器,其中10个已收到可以在同一批中处理的查询)。 这种通信方式可以是数据库(非常快的一种)或某些共享内存,这取决于所使用的技术。

然后,当等待时间花费过多(10毫秒?)或收到大量查询时,其中一个工作人员可以收集所有查询,运行批处理,并告诉其他工作人员结果在那里(在这里您再次需要一个通讯的中心点,例如PostgreSQL中的LISTEN / NOTIFY,共享内存,消息队列服务等)。

最后,每个工作人员都有责任发送正确的HTTP响应。

这里的关键是要有一个系统,在系统中,您尝试共享请求处理所花费的时间不如将多个查询一起分批节省的时间那么重要 ,并且在通信量较低的情况下,此时间应保持合理(因为在此情况下,您总是会浪费时间)等了等于白等)。 当然,您还会增加系统的复杂性 ,维护难度等。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM