golang中grpc服务器中的并发模型

Posted

技术标签:

【中文标题】golang中grpc服务器中的并发模型【英文标题】:Concurreny modelin grpc server in golang 【发布时间】:2019-04-17 05:20:41 【问题描述】:

我在 golang 中创建了一个示例 gRPC 客户端和服务器(使用了 protobufs)。我了解 golang 中的并发模型。但是,我试图了解服务器中的并发模型,该服务器接受来自同一客户端(客户端上的多个 goroutine)/多个客户端的并行请求。

更具体地说:

    当一个新的 gRPC 调用到来时,服务器是否会创建一个新的 goroutine? 这些 goroutine 共享哪些数据? grpcServer.Serve 是否为跨 goroutine 共享的数据设置了边界,即之前设置的所有内容都是共享的? (我正在考虑 Java 中的线程,其中线程共享全局数据)

【问题讨论】:

【参考方案1】:

当一个新的 gRPC 调用到来时,服务器是否会创建一个新的 goroutine?

是的,它很可能会创建大量并发 goroutine 来处理每个连接和请求(尤其是流式请求)。

这些 goroutine 共享哪些数据?

我认为这个问题太宽泛了。 net/http2google.golang.org/grpc 包中的代码太多,无需深入调查即可回答您的问题。但是,我们可以肯定,这些 goroutine 至少共享服务器本身,因为 ServeConn 不是免费函数,而是在 http2.Server 类型上定义的方法。

【讨论】:

以上是关于golang中grpc服务器中的并发模型的主要内容,如果未能解决你的问题,请参考以下文章

Golang RPC 之 gRPC

golang中的rpc包用法

golang随手记-grpc

Go语言入门篇-gRPC基于golang & java简单实现

golang下grpc的实践

谈谈RPC——golang中jsonrpc和grpc的使用