Thank you very much for the explanation, very helpful. 

I actually don't care which actual server is going to serve the client 
requests, because in my mind the clients should be agnostic. 
Those credentials parameters I talked about should be passed as 
configuration to the server, used by client objects instantiated within the 
service and these objects should remain unique for each credential and I 
hoped that it could work by instantiating multiple servicers. 

I guess that something similar to your proposed approach could be a pretty 
easy solution.

Il giorno mercoledì 6 maggio 2020 19:30:25 UTC+2, Mark D. Roth ha scritto:
>
> 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/57e316da-335f-458d-b68b-f0103313f74e%40googlegroups.com.

Reply via email to