Когда лучше использовать монолит вместо микросервисов
Что проверяют
Способны ли вы выбирать архитектуру по контексту, а не по моде. Вопрос намеренно сформулирован в пользу монолита: интервьюер смотрит, назовёте ли вы цену распределённой системы и признаки, по которым её стоит платить. Следом спрашивают, как понять, что монолит пора делить, и что вы отделите первым.
Как отвечать
Назовите ситуации, где монолит выигрывает.
- маленькая команда: пока разработчиков меньше двух десятков, независимые релизы не нужны, а обвязка микросервисов съедает сэкономленное время;
- непроверенный продукт: границы доменов ещё не понятны, ошибка в границе внутри монолита правится рефакторингом, между сервисами это миграция данных и два релиза;
- связные данные: если сценарий меняет несколько сущностей разом, монолит даёт ACID бесплатно, а распределённая версия требует саг, компенсаций и идемпотентности;
- ограниченная инфраструктура: нет платформенной команды, значит нет трассировки, единых логов и сервис-дискавери, а любой инцидент это раскопки;
- задержки: вызов функции это наносекунды, вызов по сети это миллисекунды плюс сериализация и хвост, копящийся по цепочке.
Монолит при этом не значит «ком грязи». Модульный монолит держит границы контрактами внутри процесса: пакеты по доменам, запрет прямых импортов между ними (в Python это проверяет import-linter), своя группа таблиц у модуля, события вместо вызовов. Такой монолит потом распиливается по готовым швам.
Причины для распила бывают настоящие: разные профили нагрузки и SLA, разные технологии, независимые релизы больших команд, изоляция чувствительных данных.
Для Python добавьте масштабирование монолита: несколько процессов за балансировщиком, фоновые задачи в Celery или ARQ отдельным пулом, тяжёлое вне веб-процесса.
Где спотыкаются
Ставят знак равенства между монолитом и легаси. Возраст кода и способ развёртывания это разные оси.
Обещают, что микросервисы дают масштабируемость. Монолит масштабируется теми же копиями за балансировщиком, а упирается обычно база, общая для обоих.
Не называют цену: наблюдаемость, версионирование контрактов, тестирование интеграций, отладка распределённой ошибки. Без этого ответ звучит как пересказ статьи.