Переделать связь нод в кластере на автоматическое обнаружение #9
Notifications
Due Date
No due date set.
Blocks
#2 Сделать доработки запрошенные фронтом
EventHub/EventHubBack
Reference: EventHub/EventHubBack#9
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
JOIN_NODES. Вместо него реализовать механизм автоматического поиска узлов через DNS-лукап или библиотекуlibcluster(стратегияCluster.Strategy.DNSPoll), используя общее DNS-имя сервиса (например,eventhub-node). Ноды должны самостоятельно находить друг друга и формировать кластер без ручного указания имён.🎯 Цель
Заменить статический JOIN_NODES на автоматическое обнаружение узлов через DNS-лукап, чтобы ноды могли самостоятельно формировать кластер без ручного указания имён.
📊 Анализ текущей реализации
Docker Compose: Каждая нода (eventhub-node1, eventhub-node2, eventhub-node3) имеет уникальный hostname (.local) и статическую переменную окружения JOIN_NODES с полным списком всех нод.
Erlang-код: Функция connect_nodes/0 читает JOIN_NODES и пытается подключиться к перечисленным узлам с помощью net_kernel:connect_node/1.
🛠️ План реализации
Этап 1: Подготовка Docker-окружения
Добавить общий сетевой алиас eventhub-node для всех трёх нод в docker-compose.yml. Docker Compose автоматически создаст DNS-запись, разрешающуюся в IP-адреса всех контейнеров с этим алиасом.
Удалить переменные JOIN_NODES из конфигурации.
Этап 2: Реализация обнаружения в Erlang
Создать новый модуль src/infra/cluster_discovery.erl или добавить функцию discover_nodes/0 в eventhub_app.erl.
Использовать DNS-лукап (без внешних зависимостей, таких как libcluster). В Erlang/OTP есть встроенный DNS-клиент inet_res:lookup/3, который можно использовать для разрешения имени eventhub-node в список IP-адресов.
Алгоритм:
Выполнить DNS-запрос типа A/AAAA для имени eventhub-node.
Для каждого IP-адреса сформировать полное имя узла (eventhub-node@).
Попытаться подключиться с помощью net_kernel:connect_node/1.
Повторять попытки с заданным интервалом (например, каждые 5 секунд) для обнаружения новых нод.
Этап 3: Интеграция и настройка
Заменить вызов connect_nodes/0 на новый discover_nodes/0 в eventhub_app:start/2.
Обработать таймауты и повторные попытки: использовать timer:sleep/1 и рекурсивный вызов, чтобы периодически проверять наличие новых узлов (на случай, если ноды добавляются позже).
Этап 4: Тестирование
Локальное тестирование: Запустить кластер из трёх нод через docker compose up и убедиться, что они автоматически находят друг друга.
Проверка в CI: Убедиться, что интеграционные тесты проходят без статической конфигурации.
💡 Рекомендация
DNS-лукап через inet_res проще в реализации и не требует дополнительных зависимостей, в отличие от libcluster. При этом он полностью решает задачу автоматического обнаружения в Docker-сети.