Можно ли запустить несколько экземпляров одной и той же службы на одном сервере GRP C? - PullRequest
1 голос
/ 30 апреля 2020

Я пытался выяснить, возможно ли запускать разные экземпляры одной и той же службы на одном сервере GRP C, но похоже, что я не могу этого сделать. Поэтому мне было интересно, делал ли я что-то не так с моим тестом, или это вообще невозможно.

Мой тест основан на examples / python / multiplex из grp c repo :

Служба:

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))

Сервер:

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()

Клиент:

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)

Поскольку я открываю новый канал для каждого итерации, я ожидал получить вывод со смесью "Привет, ты! Это Джим!" и «Здравствуйте, вы! Это Джон!», но вместо этого я получаю только:

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!

, то есть первый сервис GreeterServicer, который я добавил на сервер, который предположительно игнорирует второй экземпляр сервисера .

Итак, у меня вопрос: возможно ли что-то подобное на одном сервере, и есть ли лучшая практика для обработки такого сценария ios, где я хотел бы, чтобы два в основном идентичных сервиса были параметризованы по-разному ( например, разные серверы grp c (это подразумевало бы распределение нагрузки между двумя экземплярами).

В моем конкретном сценарии передаваемые параметры - это некоторые учетные данные, которые будут использоваться в реализации службы, и моя цель в таком случае эти две идентичные службы будут работать одновременно, чтобы конечный пользователь не знал, что существует несколько экземпляров.

1 Ответ

0 голосов
/ 06 мая 2020

Пояснения реализации gRP C - Go запрещают регистрировать одну и ту же службу несколько раз на объекте grp c .Server. Код

Я не очень знаком с реализацией Python, но я бы предположил, что она также делает нечто подобное. Вызов add_GreeterServicer_to_server возвращает статус или ошибку?

...