Когда переходить на микросервисы
Что проверяют
Отличаете ли вы архитектурное решение от моды и умеете ли считать цену. Хороший ответ звучит скучно: когда конкретная боль монолита стала дороже сложности распределённой системы. Следом просят назвать симптомы, по которым вы поймёте, что пора, и первый шаг.
Как отвечать
Начните с того, что порог задаёт не размер кода, а организация и требования:
- релизы блокируют друг друга: несколько команд в одной кодовой базе ждут общего релизного поезда, откат чужой правки отменяет вашу. Это самый честный триггер;
- разные профили нагрузки: тяжёлый расчёт или обработка файлов требует другого железа, чем обычные CRUD-ручки, а в монолите вы масштабируете всё целиком;
- разные требования к отказу и данным: платёжная часть с иным SLA, контур с персональными данными, который нужно изолировать по регламенту;
- чего в списке нет: числа строк кода. Порог вроде «больше десяти тысяч строк» выдуман, монолиты на сотни тысяч строк живут прекрасно при внятных внутренних границах.
Дальше о цене, она и есть содержание ответа. Сеть ненадёжна, распределённых транзакций нет, вместо них саги и компенсации, согласованность становится отложенной, отладка требует сквозной трассировки (OpenTelemetry), а каждая интеграция версионирования контракта. Входной билет тоже стоит назвать: автоматический деплой на каждый сервис, метрики и логи в одном месте, контрактные тесты, дежурства. Без этого получится распределённый монолит, где сложность выросла, а связность осталась.
Практичный путь: сначала модульный монолит с явными границами по предметным областям и без походов в чужие таблицы, затем вынос модулей по одному, начиная с того, у кого болит.
Где спотыкаются
Перечисляют преимущества микросервисов и забывают про цену. Интервьюер ждёт именно оценку компромисса, а односторонний ответ читается как отсутствие боевого опыта.
Делят монолит по техническим слоям или по таблицам. В итоге любая задача трогает три сервиса сразу, релизить их приходится вместе, и выходит худшее из обоих миров.
Забывают про данные. Разрезать код без разрезания схемы бесполезно: пока два сервиса ходят в одну таблицу, независимого развёртывания нет, а любая миграция остаётся общей.