This repository has been archived on 2024-02-11. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
astontest/README.md
2023-12-12 10:02:45 +03:00

5.7 KiB
Raw Permalink Blame History

Задание

Создайте 5 сервисов на выделенной сети Docker. С заданной частотой сервисы опрашивают сеть на наличие “соседей”. Кроме того, каждый сервис устанавливает двунаправленный поток grpc с каждым из соседей и раз в секунду отправляет и получает случайную строку, регистрируя то, что он послал и что он получил.

Дополнительно каждая из служб регистрирует новые и отпадающие ноды.

Checklist

  • Поиск соседей (service discovery)
  • Двунаправленный поток grpc со всеми соседями
  • Периодическая отправка сообщений в стрим всем соседям
  • Запись полученных и отправленных сообщений
  • Регистрация новых и отпадающих нод

Комментарии к реализации

Discovery

Для поиска соседей используется механизм рассылки широковещательных сообщений. Каждая нода периодически рассылает широковещательные сообщения со своим ip адресом, а так же случает широковещательные сообщения на том же порту и сохраняет у себя уникальный список полученных адресов. Все новые адреса отправляются в отдельный канал. За регистрацию отпадающих нод отвечает сервис рассылки сообщений, уведомляя о них discovery сервис через отдельный канал.

К отправляемому IP адресу добавляется фиксированный префикс из 3 байт для детектирования только наших пакетов и отсечения возможных сторонних пакетов.

Рассылка сообщений

Сервис рассылки сообщений получает новые адреса нод от discovery сервиса через выделенный канал и создаёт стрим для каждого полученного адреса ноды. При отключении стрима отправляет сообщение с ip адресом отвалившейся ноды в discovery сервис.

В каждый стрим периодически (период настраиваем) отправляется строка, которую возвращает подключённая реализация интерфейса DataSource (в данный момент - случайный набор символов).

Сообщения, полученные через стрим, сохраняются с использованием реализации интерфейса DataStorage (в данный момент - просто выводятся в stdout).

Запуск

docker-compose up 

Команда запустит 5 контейнеров с сервисом в одной подсети.

Через 5 секунд после запуска (период рассылки широковещательных сообщений по умолчанию), все ноды узнают друг о друге и установят двунаправленные потоки между друг другом и начнут обмен.

Можно остановить один из контейнеров

docker-compose stop s5

и увидеть в логе запущенных контейнеров сообщения о потере ноды. Запустив контейнер снова

docker-compose up s5

можно будет увидеть (в течение тех же 5 секунд), что новая нода снова включена в сеть, с ней установлены все соединения и нода снова участвует в обмене сообщениями.

Параметры конфигурации

Изменение параметров работы сервиса возможно через переменные окружения:

Параметр Описние Значение по умолчанию
DEBUG включение отладочных логов false
DISCOVERY_PORT порт discovery сервиса 4321
BROADCAST_INTERVAL интервал рассылки широковещательных сообщений discovery сервиса 5s
MESSAGING_PORT порт grpc сервиса 4322
MESSAGING_INTERVAL интервал отправки сообщений через стрим grpc сервиса 1s
RANDOM_MESSAGE_SIZE размер случайного сообщения адаптера randomstring (интерфейс DataSource) 10