20

grpc-java 在它的 executor 中使用了一个 executor ServerBuilder,如果没有被builder.executor()方法定义,默认使用一个静态缓存的线程池。这个执行器的具体用途是什么?它只是执行处理程序方法还是也做“其他事情”?

另外, grpc 是如何定义 netty worker 的EventLoopGroup?具体来说,我想知道工作线程是如何分配给这个工作组的。线程数有默认值,还是机器核心数的函数?另外,关于上述问题,这些网络工作者如何与执行者合作?他们是否只处理 I/O - 对通道的读取和写入?

编辑:Netty,默认创建(2 * 核心数)工作线程。

4

1 回答 1

28

您提供的Executor是实际执行 rpc 回调的内容。这释放了EventLoop继续处理连接上的数据。当一条新消息从网络到达时,它会在事件循环中被读取,然后向上传播到堆栈到执行程序。执行器获取消息并将它们传递给您ServerCall.Listener,您将实际处理数据。

默认情况下,gRPC 使用缓存线程池,因此非常容易上手。但是,强烈建议您提供自己的 executor。原因是默认线程池在负载下表现不佳,在其余线程忙时创建新线程。

为了设置事件循环组,您调用 NettyServerBuilder 上的workerEventLoopGroup方法。gRPC 并不严格依赖于 Netty(其他服务器传输也是可能的),因此必须使用 Netty 特定的构建器。

于 2017-02-23T17:06:47.050 回答