На базе Лабораторной работы #2 реализовать механизмы, увеличивающие отказоустойчивость системы:
- На Gateway Service для всех операций чтения реализовать паттер Circuit Breaker. Накапливать статистику в памяти, и если система не ответила N раз, то в N+1 раз вместо запроса сразу отдавать fallback. Через небольшой timeout выполнить запрос к реальной системе, чтобы проверить ее состояние.
- В случае недоступности данных из некритичного источника (не основного), возвращается fallback-ответ. В зависимости от
ситуации, это может быть:
- пустой объект или массив;
- объект, с заполненным полем (
uid
или подобным), по которому идет связь с другой системой; - default строка (если при этом не меняется тип переменной).
- В задании описаны две операции, изменяющие состояния нескольких систем. В случае недоступности одной из систем,
участвующих в этой операции, выполнить:
- откат всей операции;
- возвращать пользователю ответ об успешном завершении операции, а на Gateway Service поставить этот запрос в очередь для повторного выполнения.
- Для автоматических прогонов тестов в файле autograding.json
и classroom.yml заменить
<variant>
на ваш вариант. - Код хранить на Github, для сборки использовать Github Actions.
- Каждый сервис должен быть завернут в docker.
- В classroom.yml дописать шаги на сборку, прогон unit-тестов.
- Деплой каждого сервиса должен быть только на Heroku.
- Для локальной разработки можно использовать Postgres в docker.
- Схема взаимодействия сервисов остается как в Лабораторной работе #2.
- Для реализации очереди можно использовать language native реализацию (например, BlockingQueue для Java), либо какую-то готовую реализацию типа RabbitMQ, Redis, ZeroMQ и т.п. Крайне нежелательно использовать реляционную базу данных как средство эмуляции очереди.
- Для корректности реализации лабораторной выключается один сервис и проверяется корректность работы остальных. Для
этого используется Heroku API, сервис переводится в Maintenance Mode. Для реализации этой операции в нужно в
classroom.yml в блоке
Run API Tests
прописать переменные:envVar: '[{ "key": "serviceName", "value": "<Service Name>" }, { "key": "herokuApiKey", "value": "${{secrets.HEROKU_API_KEY}}" }]'
- Чтобы
HEROKU_API_KEY
не зашивать в коде, его нужно прописать вSettings
->Secrets
. - В переменную
serviceName
нужно прописать имя выключаемого (указан во вариантах задания) сервиса на Heroku.
- При получении задания у вас создается clone этого репозитория для вашего пользователя.
- После того, как все тесты успешно завершатся, в Github Classroom на Dashboard будет отмечено успешное выполнение тестов.
Распределение вариантов заданий аналогично ЛР #2.