【问题标题】:How are the requests handled in GRPC?GRPC 中的请求是如何处理的?
【发布时间】:2018-04-11 07:54:54
【问题描述】:

假设我给定的 GRPC 端点具有以下实现

type HandlerFunc func(ctx context.Context, in *pb.Request) (*pb.Response, error)

func newHandler() HandlerFunc {
   func (s *Server) Process(ctx context.Context, in *pb.Request) (*pb.Response, error) {
        //do processing
    }
}

type Server struct {
    Handler handler
}

func new() (s *Server) {
   return &Server{
      handler: handlers.newHandler()
   }
}
func (s *Server) Process(ctx context.Context, in *pb.Request) (*pb.Response, error) {
    return s.handler
}

现在假设多个客户端尝试调用 Process 端点。是全部调用同一个服务器实例的相同Process函数还是调用不同服务器实例的Process函数?

也是

中定义的处理程序
func newHandler() HandlerFunc {
   func (s *Server) Process(ctx context.Context, in *pb.Request) (*pb.Response, error) {
        //do processing
    }
}

处理程序的同一个实例是否处理来自同一个客户端的多个请求?还有不同的客户呢?处理程序的同一个实例是否处理来自多个客户端的请求?

【问题讨论】:

  • “服务器的不同实例”是什么意思?您是否正在运行多个服务器实例?如果您只运行一个服务器实例,则它们由同一服务器实例处理。至于使用“处理程序的同一实例”,这并没有什么意义,因为处理程序只处理一个请求。处理程序针对并发请求同时运行,如果这是您所要求的。
  • @JimB。是的多个请求。那么对于每个请求都会创建一个新的处理程序实例吗?如果我必须在多个请求之间共享内容怎么办。我该怎么做?

标签: go grpc


【解决方案1】:

很抱歉,我很难理解您提供的代码。似乎 Process 是您正在为其编写服务处理程序的 RPC 调用。但是handler 类型是什么。函数newHandler() 也被用作方法。此外,我也不认为需要包装服务处理程序。

我们如何从 gRPC 的 github 获取官方的 example 用于一元 RPC。

如果您查看here,则定义了一个处理SayHello RPC 的gRPC 服务处理程序。

多个客户端可以多次调用此 RPC,所有这些都将在单独的 goroutine 中运行。现在,可以理解的是,人们可能希望在这些调用之间共享一些信息。这可以通过为您的服务处理程序type server struct 增加更多逻辑来实现,例如具有互斥锁的数据结构。

希望这能回答一些问题。

最好的 马克

【讨论】:

    猜你喜欢
    • 2020-11-06
    • 2023-02-16
    • 2019-07-28
    • 2020-12-04
    • 2023-01-30
    • 2019-06-03
    • 2021-06-30
    • 2023-03-12
    • 2020-01-01
    相关资源
    最近更新 更多