gpt4 book ai didi

Go gRPC 客户端连接范围和池化

转载 作者:IT王子 更新时间:2023-10-29 01:04:32 28 4
gpt4 key购买 nike

考虑来自 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) 的范围应该是什么?我认为它应该与正在处理的请求范围相关,即消费者服务,但我还没有找到任何关于此的文档。我应该在这里使用连接池吗?

例如

  1. gRPC 消费者服务接收请求
  2. 建立与 gRPC 服务的连接(直接或通过池)
  3. 向 gRPC 服务发出 n 个请求
  4. 关闭 gRPC 连接(或释放回池中)

最佳答案

根据经验,gRPC 客户端连接应该在客户端应用程序的生命周期内重复使用,因为它们对于并发使用是安全的。此外,gRPC 的一个关键特性是远程过程调用的快速响应,如果您必须在收到的每个请求都重新连接,则无法实现这一点。

尽管如此,强烈建议将某种 gRPC 负载平衡与这些持久连接一起使用。否则,很多负载可能会在一些长期存在的 grpc 客户端-服务器连接上结束。负载平衡选项包括:

  1. 客户端的 gRPC 连接池与服务器端 TCP(第 4 层)负载平衡器相结合。这将首先创建一个客户端连接池,并为后续的 gRPC 请求重新使用这个连接池。在我看来,这是更容易实现的途径。参见 Pooling gRPC Connections例如,grpc 客户端上的 grpc 连接池使用 grpc-go-pool图书馆。
  2. HTTP/2(第 7 层)负载均衡器,支持 gRPC 以支持负载均衡请求。参见 gRPC Load Balancing其中概述了不同的 grpc 负载平衡选项。最近nginx added support for gRPC load balancing .

关于Go gRPC 客户端连接范围和池化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48442183/

28 4 0