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 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 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 (e.g. different grpc servers? that would imply a load balancing between the two instances).
In my particular scenario, the parameters to be passed are some credentials to be used within the service implementation, and my goal would be, then, to have these two identical services running concurrently so that the end user has no idea there are multiple instances.