【发布时间】:2018-07-04 15:52:21
【问题描述】:
考虑来自 Go gRPC 代码库的示例:
func main() {
// Set up a connection to the server.
conn, err := grpc.Dial(address, grpc.WithInsecure())
if err != nil {
log.Fatalf("did not connect: %v", err)
}
defer conn.Close()
c := pb.NewGreeterClient(conn)
// Contact the server and print out its response.
name := defaultName
if len(os.Args) > 1 {
name = os.Args[1]
}
r, err := c.SayHello(context.Background(), &pb.HelloRequest{Name: name})
if err != nil {
log.Fatalf("could not greet: %v", err)
}
log.Printf("Greeting: %s", r.Message)
}
当使用来自另一个服务的 gRPC 服务时,连接范围 (conn) 应该是什么?我认为它应该与正在处理的请求的范围有密切关系,即消费者服务,但我还没有找到任何与此相关的文档。我应该在这里使用连接池吗?
例如
- gRPC 消费者服务收到请求
- 建立与 gRPC 服务的连接(直接或通过池)
- 向 gRPC 服务发出 n 个请求
- 关闭 gRPC 连接(或释放回池)
【问题讨论】:
-
如果您打算很快发出更多请求,您应该保持连接打开并重用它。否则,或者如果您的资源非常紧张,您应该立即关闭它。不过,用您当前的示例确实无法判断。
-
当然,这个例子是从 grpc repo 中摘取的,目的是让我清楚我所说的连接的意思。必须有一些关于如何使用连接的文档......例如并发使用是否安全?
-
它们可以安全地同时使用。不过,您有一点,可以使用一些文档。看来you're not the only one是这么想的。