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