【发布时间】:2021-06-21 14:11:14
【问题描述】:
我的项目(在 golang 中)有一个用例,我需要从单个 GRPC 客户端打开多个流到单个/多个 GRPC 服务器。
假设我的 proto 文件是 -
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,这让我开始思考哪个选项更适合我的情况。
谢谢
【问题讨论】:
-
fwiw,我一直在使用单个 grpc 连接来处理流和常规调用,但没有发现问题。
-
@BurakSerdar 遇到过类似github.com/grpc/grpc-go/issues/3728 的问题吗?我正在观察类似的问题
-
到目前为止我还没有观察到这一点。