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
2023-12-12 10:02:45 +03:00

86 lines
5.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Задание
Создайте 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 |