When you make an RPC on the client, it sends the RPC service and method name to the server as the HTTP/2 path. When you register the service implementation on the server, it is essentially stored in a map keyed by that path. When the server receives a request for a particular path, it looks up the path in that map to determine which service implementation to use. Given that, hopefully it is clear why it is not possible to register two service implementations for the same service and method on the same server.
Yes, you could have two different servers listening on two different machines that have different implementations for the same service and then have your clients load-balance between them. However, I suspect that wouldn't actually help you, because you would not have any explicit control over which requests go to which server. If you actually don't care which requests go to which server, then you could probably more easily do the same thing by having a single server implementation that simply checks which implementation it used on the last request and uses the opposite one on the current request. When you say that you want to pass credentials as parameters, would these be parameters in the RPC request passed from the client? If so, I think the right way to handle that is to have a single server implementation that looks at the parameter and invokes the right underlying implementation based on which parameters were passed. I hope this information is helpful. On Monday, May 4, 2020 at 6:14:11 AM UTC-7 [email protected] wrote: > Hello everyone. > > I was trying to see if it's possible to run different instances of the > same service on a single GRPC server, but it looks like I'm not able to do > so. So I was wondering if I was doing anything wrong with my test, or if > it's not possible at all. > > My test is based on examples/python/multiplex > <https://github.com/grpc/grpc/tree/master/examples/python/multiplex> from > grpc repo: > > Service: > > > class _GreeterServicer(helloworld_pb2_grpc.GreeterServicer): > > def __init__(self, greeter): > self.greeter = greeter > > def SayHello(self, request, context): > return helloworld_pb2.HelloReply( > message='Hello, {}! This is {}!'.format(request.name, > self.greeter)) > > > Server: > > def serve(): > server = grpc.server(futures.ThreadPoolExecutor(max_workers=10)) > > helloworld_pb2_grpc.add_GreeterServicer_to_server(_GreeterServicer("John"), > server) > helloworld_pb2_grpc.add_GreeterServicer_to_server(_GreeterServicer("Jim"), > server) > server.add_insecure_port('[::]:50051') > server.start() > server.wait_for_termination() > > > Client: > > def run(): > for _ in range(10): > with grpc.insecure_channel('localhost:50051') as channel: > greeter_stub = helloworld_pb2_grpc.GreeterStub(channel) > greeter_response = greeter_stub.SayHello( > helloworld_pb2.HelloRequest(name='you')) > print("Greeter client received: " + greeter_response.message) > > > Since I'm opening a new channel for each iteration, I was expecting to get > an output with a mix of "Hello, you! This is Jim!" and "Hello, you! This is > John!", but instead I'm getting only: > > > Greeter client received: Hello, you! This is John!Greeter client received: > Hello, you! This is John!Greeter client received: Hello, you! This is > John!Greeter client received: Hello, you! This is John!Greeter client > received: Hello, you! This is John!Greeter client received: Hello, you! This > is John!Greeter client received: Hello, you! This is John!Greeter client > received: Hello, you! This is John!Greeter client received: Hello, you! This > is John!Greeter client received: Hello, you! This is John! > > > that is, the first service of GreeterServicer I added to the server, which > supposedly ignore the second servicer instance. > > > So, my question is if it's even possible to do something like this on a > single server and if there is a best practice to handle such scenarios > where I would want two mostly identical services, parameterized > differently: different servers load balanced (thus, following > https://grpc.io/blog/grpc-load-balancing best practices)? Multiple > threads implemented by me within the service? > > In my particular scenario, the parameters I'd like to pass are some > credentials to be used within the service implementation, and my goal would > be, then, to have these multiple identical services running concurrently, > with different credentials, so that the end user has no idea there are > multiple instances, when making requests. > > > Thank you very much, > > Federico > -- You received this message because you are subscribed to the Google Groups "grpc.io" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/grpc-io/19f8afea-088c-481f-9282-48b216a559fd%40googlegroups.com.
