---
metadata:
  - name: generator
    content: Diplodoc Platform v5.50.4
alternate:
  - https://ydb.tech/docs/en/recipes/ydb-sdk/service-discovery.md
  - https://ydb.tech/docs/ru/recipes/ydb-sdk/service-discovery.md
sourcePath: ru/core/recipes/ydb-sdk/service-discovery.md
---
> **Documentation Index:** Fetch the complete configuration index at https://ydb.tech/docs/ru/llms.txt

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

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

Этот сценарий можно реализовать с помощью семафоров в [узлах координации YDB](https://ydb.tech/docs/ru/reference/ydb-sdk/coordination.md) следующим образом:

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