我尝试过分析gRPC java服务器。我主要看到下面的线程池集。
总的来说,是gRPC java服务器,Netty风格还是Jetty / Tomcat风格?或者它可以配置为双向运行?
答案 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线程中(例如,您永远不应该阻止),您将需要非常小心。