Обнаружение сервисов в ZooKeeper
ПРИМЕЧАНИЕ
Концепции и основные компоненты ZooKeeper описаны в статье ZooKeeper. |
Обзор
Service Discovery — механизм ZooKeeper, действующий как реестр, в котором отслеживаются адреса всех экземпляров. Экземпляры имеют динамически назначаемые сетевые пути.
Система Service Discovery предоставляет механизм для:
-
регистрации сервисов и экземпляров сервисов;
-
поиска экземпляров конкретного сервиса;
-
уведомления об изменении экземпляров сервиса.
Процедура Service Discovery состоит из двух фаз:
-
Регистрация сервиса (Service Registration).
-
Обнаружение сервиса (Service Discovery).
Для ипользования механизма Service Discovery с учетом балансировки нагрузки используется пакет curator-x-discovery из состава клиентской библиотеки Java/JVM для Apache ZooKeeper Apache Curator.
Механизм Service Discovery представлен на следующей схеме.
Ниже описаны стадии Service Discovery.
Регистрация сервиса (Service Registration)
Когда появляется экземпляр сервиса Kafka, он регистрируется в Service Registry ZooKeeper в пространстве имен (namespace) своего сервиса, добавляя свой эфемерный znode. Znode хранит host:port
сервера в качестве своих данных. Экземпляр сервиса отправляет запросы heartbeat для подтверждения своего существования (регистрации).
Service Registry — компонент, содержащий базу данных всех доступных экземпляров сервисов. Он хранит сведения о доступных в настоящее время экземплярах каждого сервиса и их сетевые данные для установления соединения.
Service Registry отслеживает изменения в запущенных экземплярах, опрашивая среду развертывания или подписываясь на события. Когда Service Registry обнаруживает новый доступный экземпляр сервиса, он записывает его в свою базу данных. Service Registry также отменяет регистрацию отказавших (отключенных) экземпляров сервиса.
Apache Curator представляет экземпляр сервиса как класс ServiceInstance
. ServiceInstances
имеют имя, идентификатор, адрес, порт и/или порт ssl, а также необязательную полезную нагрузку (определяемую пользователем). ServiceInstances
сериализуются и хранятся в ZooKeeper следующим образом:
base path |_______ service A name |__________ instance 1 id --> (serialized ServiceInstance) |__________ instance 2 id --> (serialized ServiceInstance) |__________ ... |_______ service B name |__________ instance 1 id --> (serialized ServiceInstance) |__________ instance 2 id --> (serialized ServiceInstance) |__________ ... |_______ ...
Обнаружение сервиса (Service Discovery)
После регистрации экземпляров сервисов обнаружение сервиса происходит в следующей последовательности:
-
Клиент подключается к ансамблю ZooKeeper и запрашивает нужный сервис.
-
При помощи класса
ServiceProvider
, используемого в Apache Curator, ZooKeeper использует алгоритм балансировки нагрузки для выбора одного из доступных экземпляров сервиса и возвращаетhost:port
для одного из зарегистрированных экземпляров. -
Клиент подключается к экземпляру сервиса.