【问题标题】:Is gRPC Async server multi-threaded?gRPC 异步服务器是多线程的吗?
【发布时间】:2021-06-08 16:12:04
【问题描述】:

我们编写了一个 gRPC 异步服务器/客户端来并行化某些处理。我有一个关于异步服务器如何工作的基本问题。

例如,假设我们从客户端对一个方法进行两次相同的异步调用,但为每次调用提供不同的输入(原始数据量的一半),以便我们可以并行化此操作。当我们这样做时,服务器端发生了什么?

我的假设是服务器会将这两个调用排队,然后在两个单独的线程中同时处理它们。但是,似乎并非如此。

处理一个包含所有原始数据的单个调用所花费的时间结果小于同一方法的两个 Async 调用所花费的总时间,每个调用的原始数据为一半。为什么会这样?

谢谢!

【问题讨论】:

  • 这个问题很难回答,因为“异步”更多的是一个概念,而不是一个具体的系统工具。例如,异步性可以通过线程(如您所说)或非阻塞系统调用或批处理调用(如 selectepollkqueue 取决于系统/版本/代码库年龄)来实现。您必须查阅有问题的服务器代码才能确定。至于异步编程,最好不要假设执行的顺序或及时性。至于加速,请记住,服务器通常针对扩展使用进行优化,而不是个人请求。
  • 您好!感谢您的回复。我的问题是在 gRPC 的背景下以及我对它的理解。从 gRPC Async 示例中不清楚当我们从客户端向服务器进行异步调用时到底发生了什么。我感谢任何对此特定背景的回答。

标签: grpc


【解决方案1】:

这几乎与 gRPC 无关,而是关于分布在网络中的机器以及单台机器(似乎)如何(同时)处理多个任务。

也许一个思想实验(见下文)将有助于解释一些差异。在您的问题和思想实验中,我们都没有考虑(现实场景)存在网络延迟、连接管理时间和其他正在进行的过程。

对于单个消息,一旦服务器收到它(并假设它对其时间的其他需求可以忽略不计),它可以处理数据并返回结果(忽略 gRPC 消息必须从线路解组到 protos 和可以分成不同的类型进行处理,然后再返回进行传输等)。

对于多条消息,每条消息的接收都会中断服务器,必须对其进行解组、处理、编组、传输等。

如果没有其他进程正在进行,没有网络延迟,没有连接建立|拆除等,没有(取消)编组时间,没有处理开销(例如,为每条消息获取数据库连接),没有并发处理(消息到达完美地使得当一个完成时,下一个到达),即使那样(!!)也有不可忽略的处理开销。

单次调用

  1. 您的同事(client)通过电子邮件将数据发送给您(server)。
  2. 收到数据后,您会对其进行处理并将结果通过电子邮件发送回。

多次调用

  1. 您的同事将数据拆分为多封电子邮件给您。
  2. 收到每封电子邮件 (!) 后,您就开始处理数据。
  3. 如果另一封电子邮件在您完成之前到达,您也开始处理它。
  4. 在每个文档上给自己几秒钟的时间,但在它们之间切换。
  5. 完成每一项后,将结果通过电子邮件发送给您的同事。

另外:

  • 在向您发送电子邮件之前,您的同事去吃午饭了
  • 在处理至少一项工作时,需要带您的狗去散步。

【讨论】:

  • 您好!感谢您的详细解释。但我正在寻找专门针对 gRPC ASync 实现的答案。可能是我的措辞有误。我知道同步和异步分布式架构之间的区别。我想我已经相当清楚地提到了我使用 gRPC ASync 所面临的问题是,当我从 Async 客户端对 gRPC ASync 服务进行两次 Async 调用时,这些任务似乎是序列化的,而不是并行执行的,这是我的期望。我期待在这种情况下得到任何答案。
  • 任何服务器都不太可能序列化请求。 gRPC 服务器序列化处理的唯一时间是客户端以串行方式流式传输消息时。您可能希望将服务器语言添加到您的问题中。我不知道 Python 之外的任何单线程 gRPC 服务器,但即便如此,主机运行时也会同时处理请求。
猜你喜欢
  • 2017-06-03
  • 2023-03-12
  • 2019-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多