代码之家  ›  专栏  ›  技术社区  ›  Kylar

池GRPC管理通道和阻塞管还是一个共享?

  •  1
  • Kylar  · 技术社区  · 6 年前

    下面是我的场景:我维护一个主要充当API网关的服务。它接收一个HTTP REST请求,进行多个GRPC服务调用,然后将响应组合成上下文响应。

    此服务正在运行Jetty,当前配置有250个线程。

    我调用了几个不同的后端GRPC服务,对于每个服务,我目前正在创建一个ManagedChannel和一个BlockingStub,并在所有工作线程中共享。

    我知道这很好,因为通道和存根都是线程安全的,而且线程之间没有共享状态(我的所有请求都是等幂的)。

    然而,我很好奇这是否是做事情的“正确”方式。我读过一些关于池通道或有一个通道和多个存根的其他项目,但是如果我没有达到通道的I/O限制,我就看不到好处(因为在幕后,每个客户机调用都在调用线程中执行)。

    是否有指向Java GRPC“最佳实践”文档的特定指针可以帮助我完成这项工作?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Eric Anderson    6 年前

    听起来你做的很好。共享 ManagedChannel 尽可能合理是最重要的。不管你是否共享存根,也不管你是否共享拦截器。你是否可以分享 管理渠道 跨服务(如果任何通道指向同一目标)。

    你说得对,有些用例可能需要一个通道池来获得更高的字节吞吐量,但这只是少数情况。而且,即使在这种情况下,也可以通过创建 Channel (甚至实施 管理渠道 )在多个 管理渠道 s、 尽可能多地分享“一个”频道。