Messaging service, adapters, refactoring

This commit is contained in:
2023-12-07 09:00:30 +03:00
parent cf00cfaab6
commit 08a7c9c04f
18 changed files with 623 additions and 53 deletions

85
README.md Normal file
View File

@@ -0,0 +1,85 @@
# Задание
Создайте 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 |