【问题标题】:How to get gRPC response limit如何获取 gRPC 响应限制
【发布时间】:2021-05-26 23:13:12
【问题描述】:

我有返回一些项目数组的 Go gRPC 端点。我想限制响应的项目​​数,以适应 gRPC 允许发送的最大值。

我的想法是在处理函数 func 中获得最大值,然后将其除以项目大小,然后瞧。但是我怎样才能获得最大响应大小?

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


ma​​in.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
}

【问题讨论】:

  • 我认为将方法的行为与通道的属性结合起来并不是一个好的设计,无论您是显式还是隐式地这样做。如果您希望退回大量商品,请考虑使用server-streaming RPC
  • 我总体上同意你的看法。但有时我们必须做一些坏事才能让遗留代码正常工作。问题仍然是“我们能知道什么是 gRPC 响应限制吗?”
  • 您是否尝试过检查电话收到的context.Context?我怀疑如果以正确的方式刺激它可能会泄露CallOptions。也许不是以非常支持的方式,但你暗示你愿意做坏事,所以......;)

标签: go grpc


【解决方案1】:

尝试在您的客户端上更新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: %v\n", err)
        return
    }
    defer cc.Close()

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

【讨论】:

  • 正如我在问题中所写,我不想设置限制,因为我的代码是更大服务的一部分。我需要获取值而不是设置它
猜你喜欢
  • 2022-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-10
  • 1970-01-01
  • 2020-01-18
  • 2020-04-02
  • 1970-01-01
相关资源
最近更新 更多