go语言 grpc 03  线程模型_反序列化

go语言 grpc 03  线程模型_线程模型_02

go语言 grpc 03  线程模型_线程模型_03

go语言 grpc 03  线程模型_线程模型_04

go语言 grpc 03  线程模型_序列化_05

go语言 grpc 03  线程模型_反序列化_06

go语言 grpc 03  线程模型_反序列化_07

go语言 grpc 03  线程模型_线程模型_08

go语言 grpc 03  线程模型_序列化_09

go语言 grpc 03  线程模型_序列化_10

go语言 grpc 03  线程模型_反序列化_11

go语言 grpc 03  线程模型_序列化_12

I/O 通信线程模型

gRPC 的做法是服务端监听线程和 I/O 线程分离的 Reactor 多线程模型,它的代码如下所示(NettyServer 类)

go语言 grpc 03  线程模型_线程模型_13

go语言 grpc 03  线程模型_反序列化_14

go语言 grpc 03  线程模型_序列化_15

go语言 grpc 03  线程模型_反序列化_16

go语言 grpc 03  线程模型_反序列化_17

客户端线程模型概述

go语言 grpc 03  线程模型_反序列化_18

go语言 grpc 03  线程模型_线程模型_19

go语言 grpc 03  线程模型_线程模型_20

go语言 grpc 03  线程模型_反序列化_21

HTTP/2 Header 的创建、以及请求参数反序列化为 Protobuf,均由用户线程负责完成

客户端响应消息的接收,由 gRPC 的 NettyClientHandler 负责;

接收到 HTTP/2 响应之后,Netty 将消息投递到 SerializingExecutor,由 SerializingExecutor 的 ThreadlessExecutor 负责响应的反序列化,以及 responseFuture 的设值

go语言 grpc 03  线程模型_线程模型_22

go语言 grpc 03  线程模型_序列化_23

go语言 grpc 03  线程模型_序列化_24

如果大量的 Handler 都在 Netty I/O 线程中执行,一旦某些 Handler 执行比较耗时,则可能会反向影响 I/O 操作的执行,像序列化和反序列化操作,都是 CPU 密集型操作,更适合在业务应用线程池中执行,提升并发处理能力。因此,gRPC 并没有在 I/O 线程中做消息的序列化和反序列化。

go语言 grpc 03  线程模型_线程模型_25