GRPC - 将原型序列化 cpu 阶段与 IO 阶段分开

GRPC - Separate proto serialization cpu stage from IO stage

我们有一个在重负载下发送 grpc 请求的服务。 通常,grpc send 被认为是一个 IO 阶段,这意味着它应该使用一个 IO 线程池。 我们注意到 proto 对象的序列化时间消耗相当多 cpu,这不适合与 IO 线程池一起使用。 有什么方法可以将序列化步骤与 IO 步骤分开,例如,我们可以做一些类似的事情吗:

val bytes = myProto.toBytes()
myService.send(bytes)

我们无法控制 .proto 文件和服务器,但我们可以生成客户端和存根。我们目前使用 scalapb,但 java 也可以。

另一种选择是以某种方式将客户端调用转换为 http2 调用,有人试过吗?

关于如何解决这个问题还有其他建议吗? 提前致谢。

gRPC 本身将 protobuf 编码与传输分开。 Protobuf 编码和解码在应用程序线程上执行:调用 gRPC 的线程和传递回调的线程(例如,channelBuilder.executor())。然后使用单独的网络线程(Netty 事件循环)异步处理 I/O。只需在可以处理 protobuf CPU 成本的线程上与 gRPC 交互。