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