Обнаружение сервисов в ZooKeeper

ПРИМЕЧАНИЕ

Концепции и основные компоненты ZooKeeper описаны в статье ZooKeeper.

Обзор

Service Discovery — механизм ZooKeeper, действующий как реестр, в котором отслеживаются адреса всех экземпляров. Экземпляры имеют динамически назначаемые сетевые пути.

Система Service Discovery предоставляет механизм для:

  • регистрации сервисов и экземпляров сервисов;

  • поиска экземпляров конкретного сервиса;

  • уведомления об изменении экземпляров сервиса.

Процедура Service Discovery состоит из двух фаз:

  1. Регистрация сервиса (Service Registration).

  2. Обнаружение сервиса (Service Discovery).

Для ипользования механизма Service Discovery с учетом балансировки нагрузки используется пакет curator-x-discovery из состава клиентской библиотеки Java/JVM для Apache ZooKeeper Apache Curator.

Механизм Service Discovery представлен на следующей схеме.

Механизм Service Discovery в ZooKeeper
Механизм Service Discovery в ZooKeeper
Механизм Service Discovery в ZooKeeper
Механизм Service Discovery в ZooKeeper

Ниже описаны стадии 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)

После регистрации экземпляров сервисов обнаружение сервиса происходит в следующей последовательности:

  1. Клиент подключается к ансамблю ZooKeeper и запрашивает нужный сервис.

  2. При помощи класса ServiceProvider, используемого в Apache Curator, ZooKeeper использует алгоритм балансировки нагрузки для выбора одного из доступных экземпляров сервиса и возвращает host:port для одного из зарегистрированных экземпляров.

  3. Клиент подключается к экземпляру сервиса.

Нашли ошибку? Выделите текст и нажмите Ctrl+Enter чтобы сообщить о ней