Для службы Grpc используется балансировка нагрузки на стороне клиента.
Создание канала
ManageChannelBuilder.forTarget("host1:port,host2:port,host3:port").nameResolverFactory(new CustomNameResolverProvider()).loadBalancerFactory(RoundRobinBalancerFactory.getInstance()).usePlaintText(true).build();
Используйте этот канал для создания заглушки.
Проблема
Если одна из служб [host1] выйдет из строя, будет ли заглушка обрабатывать этот сценарий и не будет отправлять дальнейшие запросы службе [host1]?
Согласно документации на https://grpc.io/blog/loadbalancing
A thick client approach means the load balancing smarts are implemented in the client. The client is responsible for keeping track of available servers, their workload, and the algorithms used for choosing servers. The client typically integrates libraries that communicate with other infrastructures such as service discovery, name resolution, quota management, etc.
Так является ли ответственность класса ManagedChannel поддерживать список активных серверов или код приложения должен поддерживать список активных серверов и каждый раз создавать экземпляр ManagedChannel со списком активных серверов?
Результат испытаний
Согласно тесту, если одна из служб выходит из строя, это не влияет на балансировку нагрузки, и все запросы обрабатываются правильно.
Так можно ли предположить, что класс-заглушка или класс ManagedChannel обрабатывают список активных серверов?
Ответ с документацией будет высоко оценен.
Это пользовательский класс, спасибо за указание. Изменено имя класса на CustomNameResolverProvider.




Балансировщики нагрузки обычно обрабатывают узлы, которые выходят из строя. Даже если узлы управляются внешней службой, они могут внезапно выйти из строя, и балансировщики нагрузки стараются избегать этих узлов. Таким образом, все реализации Load Balancer для gRPC, о которых я знаю, позволяют избежать неудачных вызовов, когда серверная часть не работает.
Pick First (по умолчанию) перебирает адреса, пока не сработает один. Round Robin только циклические переборы по рабочим соединениям. Так что то, что вы описываете, должно работать нормально.
Замечу, что у вашего подхода есть один недостаток: вы не можете менять серверы во время выполнения процесса. Удаление сломанных бэкэндов — это одно, а добавление новых рабочих бэкэндов — совсем другое. Если ваша нагрузка слишком высока, вы не сможете решить проблему, добавив больше рабочих процессов, потому что даже если вы добавите больше рабочих процессов, ваши клиенты не будут к ним подключаться.
Хороший момент в отношении добавления нового работника, необходимо проверить сценарий. Не могли бы вы предложить некоторые рекомендации по добавлению рабочего процесса в клиент GRPC? В настоящее время список свойств сервера настроен в конфигурации сервера, который клиент будет читать и инициализировать канал.
Реализация собственного преобразователя имен позволит вам замечать обновления. Я не знаю, какой объем конфигурации необходимо передать в преобразователь имен, но включение его в целевое имя (например, "yournr:///the_config_you_need") не слишком сложно для ограниченного объема данных.
где мы можем найти класс MulipleHostsNameResolverProvider