Performance http响应的批处理生成

Performance http响应的批处理生成,performance,rest,http,architecture,Performance,Rest,Http,Architecture,我试图为下面的场景找到一个体系结构。我正在构建一个REST服务,它执行一些可以快速批量计算的计算。假设计算一个“项目”需要50毫秒,计算100个“项目”需要60毫秒 但是,客户机的性质是一次只需要处理1个项目。因此,如果我同时有100个客户端,我编写典型的请求处理程序来发送一个项目并生成一个响应,我最终将使用5000ms,但我知道我可以在60ms内计算相同的时间 我试图找到一种在这种情况下运行良好的体系结构。也就是说,我希望有一些东西能够合并来自许多独立请求的数据,处理该批处理,并为每个客户机生

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

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

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


如果你好奇的话,所讨论的服务是基于python+django+DRF的,但是我很好奇这里应用了什么样的体系结构解决方案/模式,以及是否有任何解决方案可用。

首先,你可以想到一个反向代理来检测所有特定于模式的查询,收集所有这些查询并以HTTP 1.1管道将其发送到应用程序(管道是一种一个接一个地发送大量查询并在最后以相同顺序接收所有HTTP响应的方法,而无需在每次查询后等待响应)

但是:

  • 管道很难做好
  • 您必须对反向代理进行编码,因为我不知道如何进行编码
  • 管道中的一个慢响应会阻止所有其他响应
  • 您需要一个能够向应用程序语言提供多个查询的http服务器,如果http服务器没有直接在应用程序中编码,这是永远不会发生的,因为通常http只处理一个查询(就像在PHP环境中从未收到2个查询一样,您会收到第一个查询,发送响应,然后再接收下一个查询,即使连接包含2个查询)
  • 因此,最好在应用程序端执行该操作。您可以识别匹配的查询,并等待一小段时间(10ms?)以查看是否还有其他查询传入。您需要一种在多个并行工作人员之间进行通信的方法(比如你有50名应用程序工作人员,其中10人收到了可以在同一批中处理的查询)。这种通信方式可以是数据库(非常快速的)或共享内存,这取决于所使用的技术

    然后,当等待时间过长(10毫秒?)或收到大量查询时,其中一个工作人员可以收集所有查询,运行批处理,并告诉其他所有工作人员结果已经存在(这里同样需要一个中心通信点,如PostgreSQL中的侦听/通知、共享内存、消息队列服务等)

    最后,每个工作者负责发送正确的HTTP响应


    这里的关键是要有一个系统,在这个系统中,您在尝试共享请求时所花费的时间比在一起批处理多个查询时所节省的时间要少,并且在流量较低的情况下,这一次应该是合理的(因为在这里,您总是会浪费时间,无所事事地等待)当然,您也在系统上增加了一些复杂性,更难维护,等等。

    这不只是关于线程吗?如果计算速度不是那么快,我会建议使用缓存来实现这个想法……我一直在考虑使用消息队列而不是数据库或共享内存,这样请求处理程序就可以等待答复。