如何获得gRPC响应极限



我有一个Go gRPC端点,返回一些项目的数组。我想限制响应项的数量,使其符合gRPC允许发送的最大值。

我的想法是在handler函数中获得最大值,将其除以项目大小和体积。但如何得到响应最大大小呢?

我不想设置最大响应大小,使我的类独立于grpc实例化。


main.go

package main
import (
"log"
"main/api"
"main/router"
"net"
"google.golang.org/grpc"
)
func main() {
l, err := net.Listen("tcp", "0.0.0.0:138080")
if err != nil {
log.Fatalf("failed to listen: %v", err)
}
grpcServer := grpc.NewServer()
r := router.New()
api.RegisterTestGenerateServiceServer(grpcServer, r)
err = grpcServer.Serve(l)
if err != nil {
log.Fatalf("failed to run server: %v", err)
}
}

router.go

package router
import (
"context"
"main/api"
"main/model"
"unsafe"
)
type router struct {
}
func New() *router {
return &router{}
}
func (r *router) TestCall(context.Context, *api.TestCallRequest) (*api.TestCallResponse, error) {
items := somewhere.GetItems()
apiItems := transform.ToAPIItems(items)

itemSize := unsafe.Sizeof(model.Item{})

responseSize := someWonderFuncGetGrpcResponseMaxSize()

NItems := responseSize / itemSize
return &api.TestCallResponse{
Items: apiItems[:NItems],
}, nil
}

尝试更新grpc。MaxCallSendMsgSize(s int)在您的客户端上,使您的客户端发送更大的消息。这对我来说很有效,例如:

func main() {
// create connection
opts := []grpc.DialOption{
// grpc.WithInsecure(),
grpc.WithDefaultCallOptions(grpc.MaxCallRecvMsgSize(math.MaxInt32)), // uncomment for large amount of data returned
}
cc, err := grpc.Dial("localhost:9089", opts...)
if err != nil {
fmt.Printf("failed to dial: %vn", err)
return
}
defer cc.Close()
client := pb.NewGrpcServiceClient(cc)
data, err := client.GetDataFromGRPCService()

最新更新