# Задание Создайте 5 сервисов на выделенной сети Docker. С заданной частотой сервисы опрашивают сеть на наличие “соседей”. Кроме того, каждый сервис устанавливает двунаправленный поток grpc с каждым из соседей и раз в секунду отправляет и получает случайную строку, регистрируя то, что он послал и что он получил. Дополнительно каждая из служб регистрирует новые и отпадающие ноды. ## Checklist - [x] Поиск соседей (service discovery) - [x] Двунаправленный поток grpc со всеми соседями - [x] Периодическая отправка сообщений в стрим всем соседям - [x] Запись полученных и отправленных сообщений - [x] Регистрация новых и отпадающих нод # Комментарии к реализации ## Discovery Для поиска соседей используется механизм рассылки широковещательных сообщений. Каждая нода периодически рассылает широковещательные сообщения со своим ip адресом, а так же случает широковещательные сообщения на том же порту и сохраняет у себя уникальный список полученных адресов. Все новые адреса отправляются в отдельный канал. За регистрацию отпадающих нод отвечает сервис рассылки сообщений, уведомляя о них discovery сервис через отдельный канал. К отправляемому IP адресу добавляется фиксированный префикс из 3 байт для детектирования только наших пакетов и отсечения возможных сторонних пакетов. ## Рассылка сообщений Сервис рассылки сообщений получает новые адреса нод от discovery сервиса через выделенный канал и создаёт стрим для каждого полученного адреса ноды. При отключении стрима отправляет сообщение с ip адресом отвалившейся ноды в discovery сервис. В каждый стрим периодически (период настраиваем) отправляется строка, которую возвращает подключённая реализация интерфейса `DataSource` (в данный момент - случайный набор символов). Сообщения, полученные через стрим, сохраняются с использованием реализации интерфейса `DataStorage` (в данный момент - просто выводятся в stdout). # Запуск ```shell docker-compose up ``` Команда запустит 5 контейнеров с сервисом в одной подсети. Через 5 секунд после запуска (период рассылки широковещательных сообщений по умолчанию), все ноды узнают друг о друге и установят двунаправленные потоки между друг другом и начнут обмен. Можно остановить один из контейнеров ```shell docker-compose stop s5 ``` и увидеть в логе запущенных контейнеров сообщения о потере ноды. Запустив контейнер снова ```shell 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 |