Обнаружение сервисов (service discovery)

Рассмотрим сценарий, где экземпляры приложения динамически поднимаются и публикуют свой endpoint, а другие клиенты хотят получать этот список и реагировать на его изменения.

Этот сценарий можно реализовать с помощью семафоров в узлах координации YDB следующим образом:

  1. Создаётся семафор (например, с именем my-service-endpoints) с Limit=Max<ui64>().
  2. Все экземпляры приложения выполняют AcquireSemaphore с Count=1, указывая в Data свой endpoint.
  3. Поскольку лимит семафора очень большой, все вызовы AcquireSemaphore должны завершиться быстро.
  4. На этом этапе публикация завершена, и экземплярам приложения нужно только реагировать на остановку сессии, публикуя себя заново через новую сессию.
  5. Клиенты выполняют DescribeSemaphore с IncludeOwners=true и, при необходимости, с WatchOwners=true. В результате вызова в поле Owners в Data будут содержаться endpoint'ы зарегистрированных экземпляров приложения.
  6. При изменении списка endpoint'ов вызывается OnChanged. В этом случае клиенты выполняют аналогичный вызов DescribeSemaphore и получают обновлённый список.