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

时间:2017-11-27 06:21:14

标签: server netty grpc grpc-java

我尝试过分析gRPC java服务器。我主要看到下面的线程池集。

  • grpc-default-executor线程:为每个传入请求创建1。
  • grpc-default-worker-ELG线程:可能是收听传入的gRPC请求&分配给上面的" grpc-default-executor"线程。

总的来说,是gRPC java服务器,Netty风格还是Jetty / Tomcat风格?或者它可以配置为双向运行?

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:0)

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