Messaging service, adapters, refactoring
This commit is contained in:
85
README.md
Normal file
85
README.md
Normal 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 |
|
||||
|
||||
Reference in New Issue
Block a user