让我们说我给定的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
}
}
处理程序的同一个实例是否处理来自同一客户端的多个请求?还有不同的客户呢?是处理来自多个客户端的请求的处理程序的相同实例吗?
答案 0 :(得分:0)
对不起,我很难理解您提供的代码。似乎Process
是您正在为其编写服务处理程序的RPC调用。但那么handler
类型是什么。函数newHandler()
也用作方法。此外,我也没有看到包装服务处理程序的必要性。
我们如何从gRPC的github获取一元RPC的官方example。
如果查看here,则会定义一个处理SayHello
RPC的gRPC服务处理程序。
多个客户端可以对此RPC进行多次调用,所有这些调用都将在单独的goroutine中运行。现在,人们可能希望在这些调用之间共享一些信息是可以理解的。这可以通过使用更多逻辑扩充服务处理程序type server struct
来实现,例如具有互斥锁的数据结构。
希望这能回答一些问题。
最佳麦