Лабораторная работа #3
Fault Tolerance
Формулировка
На базе Лабораторной работы #2 реализовать механизмы, увеличивающие
отказоустойчивость системы.
Требования
- На Gateway Service для всех операций чтения реализовать паттерн Circuit Breaker. Накапливать статистику в памяти, и
если система не ответила N раз, то в N + 1 раз вместо запроса сразу отдавать fallback. Через небольшой timeout
выполнить запрос к реальной системе, чтобы проверить ее состояние.
- На каждом сервисе сделать специальный endpoint
GET /manage/health
, отдающий 200 ОК, он будет использоваться для
проверки доступности сервиса (в Github Actions в скрипте проверки готовности всех
сервисов wait-script.sh и в тестах test-script.sh).
"$path"/wait-for.sh -t 120 "http://localhost:$port/manage/health" -- echo "Host localhost:$port is active"
- В случае недоступности данных из некритичного источника (не основного), возвращается fallback-ответ. В зависимости от
ситуации, это может быть:
- пустой объект или массив;
- объект, с заполненным полем (
uid
или подобным), по которому идет связь с другой системой;
- default строка (если при этом не меняется тип переменной).
- В задании описаны две операции, изменяющие состояния нескольких систем. В случае недоступности одной из систем,
участвующих в этой операции, выполнить:
- откат всей операции;
- возвращать пользователю ответ об успешном завершении операции, а на Gateway Service поставить этот запрос в
очередь для повторного выполнения.
- Для автоматических прогонов тестов в файле autograding.json
и classroom.yml заменить
<variant>
на ваш вариант.
- В docker-compose.yml прописать сборку и запуск docker контейнеров.
- Код хранить на Github, для сборки использовать Github Actions.
- Каждый сервис должен быть завернут в docker.
- В classroom.yml дописать шаги на сборку, прогон unit-тестов.
Пояснения
- Для локальной разработки можно использовать Postgres в docker.
- Схема взаимодействия сервисов остается как в Лабораторной работы #2.
- Для реализации очереди можно использовать language native реализацию (например, BlockingQueue для Java), либо
какую-то готовую реализацию типа RabbitMQ, Redis, ZeroMQ и т.п. Крайне нежелательно использовать реляционную базу
данных как средство эмуляции очереди.
- Можно использовать внешнюю очередь или запускать ее в docker.
- Для проверки отказоустойчивости используется остановка и запуск контейнеров docker, это делает
скрипт test-script.sh. Скрипт нужно запускать из корня проекта, т.к. он обращается к папке
postman по вариантам.
# запуск тестового сценария:
# * <variant> – номер варианта (v1 | v2 | v3 | v4 )
# * <service> – имя сервиса в Docker Compose
# * <port> – порт, на котором запущен сервис
$ scripts/test-script.sh <variant> <service> <port>
Прием задания
- При получении задания у вас создается fork этого репозитория для вашего пользователя.
- После того как все тесты успешно завершатся, в Github Classroom на Dashboard будет отмечено успешное выполнение
тестов.
Варианты заданий
Распределение вариантов заданий аналогично ЛР #2.
- Flight Booking System
- Hotels Booking System
- Car Rental System
- Library System