Выбор лидера (leader election)

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

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

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