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

5.7 KiB
Raw 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