gRPC服务器是否为每个请求启动一个新线程?

Ven*_*esh 6 netty server grpc grpc-java

我尝试分析gRPC Java服务器。而且我主要看到以下线程池集。

  • grpc-default-executor线程:为每个传入请求创建1个。
  • grpc-default-worker-ELG线程:可以侦听传入的gRPC请求并分配给上述“ grpc-default-executor”线程。

总的来说,是gRPC java服务器,Netty样式还是Jetty / Tomcat样式?还是可以配置为同时运行?

Eri*_*son 8

gRPC Java 服务器更接近于 Jetty/Tomcat 风格,除了它是异步的。也就是说,在普通的 Servlet 中,每个请求都消耗一个线程,直到它完成。虽然较新的 Servlet 版本允许您与专用线程分离并继续异步工作(释放线程以供其他用途),但这种情况并不常见。在 gRPC 中,您可以自由地以任何一种方式工作。请注意,gRPC 默认使用 cachedThreadPool 来重用线程;在服务器端,最好通过ServerBuilder.executor().

gRPC Java 在内部使用 Netty 风格。这意味着完全非阻塞。您可以使用ServerBuilder.directExecutor()在 Netty 线程上运行。虽然在这种情况下,你可能要指定NettyServerBuilder.bossEventLoopGroup()workerEventLoopGroup()以及兼容性channelType()

  • 是否有来自 gRPC 的文档详细讨论了这一点? (4认同)

Nor*_*rer 1

据我所知,您可以在构建 GRPC 服务器/客户端时指定使用 directExecutor(),这将确保所有工作都在 IO 线程中完成,因此线程将被共享。出于安全原因,默认情况下不这样做,因为如果您在 IO 线程中,则需要非常小心地执行操作(就像您永远不应该阻塞在那里一样)。