问题描述
我的项目(在 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,通常建议您对到同一服务器的所有流使用单个连接。主要的例外是对每个连接的并发流数量有限制的服务器。