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