【发布时间】:2021-05-26 23:13:12
【问题描述】:
我有返回一些项目数组的 Go gRPC 端点。我想限制响应的项目数,以适应 gRPC 允许发送的最大值。
我的想法是在处理函数 func 中获得最大值,然后将其除以项目大小,然后瞧。但是我怎样才能获得最大响应大小?
我不想设置最大响应大小以使我的类独立于 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
}
【问题讨论】:
-
我认为将方法的行为与通道的属性结合起来并不是一个好的设计,无论您是显式还是隐式地这样做。如果您希望退回大量商品,请考虑使用server-streaming RPC。
-
我总体上同意你的看法。但有时我们必须做一些坏事才能让遗留代码正常工作。问题仍然是“我们能知道什么是 gRPC 响应限制吗?”
-
您是否尝试过检查电话收到的
context.Context?我怀疑如果以正确的方式刺激它可能会泄露CallOptions。也许不是以非常支持的方式,但你暗示你愿意做坏事,所以......;)