Почему я отказался от микросервисов в пет-проекте

20.02.2025 · 5 мин

Диаграмма архитектуры на доске

Полтора года назад я начал пет-проект — небольшой сервис для учёта личных расходов — и на радостях сразу нарисовал схему из семи микросервисов: авторизация, транзакции, категории, отчёты, уведомления, импорт банковских выписок и API-шлюз. Через месяц я всё это снёс и написал заново в виде одного монолитного приложения. Хочу объяснить, почему.

Соблазн красивой архитектуры

На работе я много имею дело с распределёнными системами, и мне казалось естественным переносить этот опыт на личный проект. Микросервисы выглядят солидно на диаграмме, каждый сервис — отдельная ответственность, всё по книжке. Проблема в том, что книжка писалась для команд из десятков человек и систем с реальной нагрузкой, а не для одного разработчика, который открывает ноутбук по вечерам два раза в неделю.

Где всё пошло не так

Первая проблема — локальная разработка. Чтобы просто проверить, как работает добавление транзакции, нужно было поднять пять контейнеров и убедиться, что все они видят друг друга по сети. Это отнимало больше времени, чем сама разработка фичи.

Вторая проблема — отладка. Ошибка «транзакция не сохранилась» могла быть в трёх разных сервисах, и чтобы её найти, приходилось прыгать между логами каждого из них. В монолите та же ошибка находится через один брейкпоинт.

Третья, и главная — я не разработчик-фрилансер с временем на поддержку инфраструктуры ради инфраструктуры. У пет-проекта нет команды, которая распределит работу по сервисам, и нет пользователей, для которых важна независимая масштабируемость отчётов и авторизации.

Что получилось после переписывания

Одно Go-приложение с чёткими внутренними пакетами: auth, transactions, reports, notify. Каждый пакет знает только о своих интерфейсах, но всё это компилируется и деплоится как один бинарник. Локальный запуск — одна команда, без Docker Compose с семью сервисами.

Если проект когда-нибудь вырастет настолько, что отдельным частям понадобится независимое масштабирование — границы пакетов уже нарисованы, и выделить сервис из монолита будет относительно недорого. Но пока в этом нет практического смысла.

Вывод, который я стараюсь не забывать

Микросервисы решают организационную проблему — как позволить многим командам работать независимо, — а не техническую проблему производительности сама по себе. Если у вас нет этой организационной проблемы, скорее всего, вам не нужно и её архитектурное решение. Модульный монолит почти всегда правильная отправная точка, а иногда и правильная конечная.