Какие паттерны проектирования используются в микросервисах
Что проверяют
Знаете ли вы приёмы по группам и понимаете ли, какую задачу решает каждый.
Как отвечать
Сгруппируйте, иначе получится россыпь названий.
Разделение на сервисы: по бизнес-возможностям или по поддоменам предметной области. Главный критерий это границы, вдоль которых система меняется, а не технические слои.
Работа с данными:
- база на сервис: никакого общего хранилища, иначе схема становится общим контрактом;
- сага для операций через несколько сервисов, с компенсирующими действиями вместо отката;
- транзакционный ящик исходящих: запись в базу и публикация события одной транзакцией;
- разделение команд и запросов с отдельными моделями чтения;
- сборка ответа из нескольких сервисов там, где нужен объединённый результат.
Взаимодействие и вход:
- шлюз API как единая точка входа с авторизацией и ограничением частоты;
- отдельный сервер под каждый тип клиента, чтобы мобильное приложение не получало ответ, собранный под веб;
- обнаружение сервисов и балансировка;
- вспомогательный контейнер и сетевая прослойка, выносящие повторы, шифрование и трассировку из кода.
Устойчивость:
- таймауты на каждом внешнем вызове;
- повторы с экспоненциальной задержкой и разбросом, обязательно ограниченные;
- предохранитель, чтобы не добивать упавшего соседа и не копить зависшие запросы;
- переборка: отдельный пул ресурсов на каждую зависимость;
- ключ идемпотентности против дублей.
Выкладка и наблюдаемость: параллельные окружения, постепенный выпуск на долю пользователей, флаги функциональности, проверки состояния, сквозная трассировка с общим идентификатором запроса, сбор логов в одном месте.
Миграция из монолита: постепенное вытеснение, когда новая функциональность выносится наружу, а трафик переключается по частям, и слой изоляции, не пускающий чужую модель данных внутрь.
Где спотыкаются
Перечисляют названия без задач, которые они решают.
Ставят повторы без предохранителя.
Заводят общую базу для двух сервисов.
Начинают с полного переписывания вместо постепенного вытеснения.