5.7 KiB
Задание
Создайте 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 |