How to get gRPC response limit

Viewed 280

I have Go gRPC endpoint that returns an array of some items. I want to limit the number of items in response to make fit the maximum that gRPC allows to send.

My idea is to get the maximum in handler func, divide it by item size and voilà. But how can I get response max size?

I don't want to set max response size to make my class independent of grpc instantiation.


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
}
1 Answers

Try updating grpc.MaxCallSendMsgSize(s int) on your client to enable your client send larger message. This worked for me, as example:

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: %v\n", err)
        return
    }
    defer cc.Close()

    client := pb.NewGrpcServiceClient(cc)
    data, err := client.GetDataFromGRPCService()
Related