转到gRPC客户端连接范围和池

时间:2018-01-25 11:50:34

标签: go grpc

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

E.G。

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

1 个答案:

答案 0 :(得分:3)

根据经验,应该在客户端应用程序的生命周期中重用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