我们是否需要为同一客户端的不同流使用不同的 grpc 连接特定于 golang?

问题描述

我的项目(在 golang 中)有一个用例,我需要打开从单个 GRPC 客户端到单个/多个 GRPC 服务器的多个流。

说我的原型文件是 -

Syntax = "proto3";
package helloworld;

// The greeting service deFinition.
service Greeter {
  // Sends a greeting
  rpc SayHello (stream HelloRequest) returns (stream HelloReply) {}
}

// The request message containing the user's name.
message HelloRequest {
  string name = 1;
}

// The response message containing the greetings
message HelloReply {
  string message = 1;
}  

现在对于我的客户,我有 2 个选择 -

package main

import (
    "google.golang.org/grpc"
    "hello/grpc/helloworld"
)

func newConn() helloworld.GreeterClient {
    conn,err := grpc.Dial("localhost:9009",grpc.WithInsecure())
    if err != nil {
        panic(err)
    }
    return helloworld.NewGreeterClient(conn)
}

func clientWork(client helloworld.GreeterClient) {
    // client work
}

func main() {
    // option 1 - new connection objects for all streams
    for i:=0; i<1000; i++ {
        clientWork(newConn())
    }
    
    // option 2 - single connection object for all streams
    globalConn := newConn()
    for i:=0; i<1000; i++ {
        clientWork(globalConn)
    }
}

选项 1 为流使用新的 grpc.Conn

选项 2 对所有流使用单个全局 grpc.Conn

我的问题 - 他们是否有任何推荐的方法来实现相同的目标(如果是特定情况,我可以得到一些例子)

我经历了 https://github.com/grpc/grpc-go/issues/2086#issuecomment-389947160,这表明要释放底层缓冲区/内存,我几乎没有选择,其中之一包括关闭 grpc.Conn,这让我思考哪个选项应该更适合我的情况。

谢谢

解决方法

对于 gRPC,通常建议您对到同一服务器的所有流使用单个连接。主要的例外是对每个连接的并发流数量有限制的服务器。