История о том, почему архитектурная «красота» не всегда означает практическую пользу
Всем привет! Хочу поделиться историей своего архитектурного провала. Началось с простой задачи: парсинг 3 ГБ текстовых данных. Звучит как работа для скрипта? Я же решил, что это отличный повод построить «идеальную» систему на микросервисах. Результат: 4 сервиса, 8 ГБ ОЗУ и 15 ГБ на диске для решения элементарной задачи.
Что пошло не так: хронология переусложнения
Вот архитектура, которую я создал:
nodehistj-download-service — отдельный сервис для загрузки файлов
nodehistj-newest-nodelists — сервис для работы с актуальными данными
nodehistj-historic-nodelists — сервис для хранения исторических данных
nodehistj-history-diff — сервис для сравнения версий
Каждый сервис — полноценное Spring Boot-приложение со своей базой PostgreSQL. Единой точки входа не было — клиент должен был общаться с каждым API отдельно.
Цена архитектурных решений
Система потребляла неадекватные ресурсы:
Память: 6-8 ГБ ОЗУ в простое
Диск: 15+ ГБ вместо исходных 3 ГБ
Процессор: 4 ядра для фоновых задач
При этом функциональность оставалась базовой: парсинг текстовых файлов и отображение истории изменений.
Почему это стало проблемой
Сложность отладки — поиск ошибок в четырёх независимых сервисах
Ресурсоёмкость — высокие требования к инфраструктуре
Затраты на развитие — даже простые изменения требовали правки в нескольких сервисах
Выводы, которые я сделал
Микросервисы ≠ панацея — они решают конкретные проблемы масштабирования
Spring Boot добавляет накладные расходы — каждый модуль имеет свою цену
Архитектура должна соответствовать задаче — не стоит создавать распределённую систему для локальной проблемы
Интеграционная сложность — отсутствие единого API усложняет клиентскую часть
Этот опыт научил меня трезво оценивать необходимость использования сложных архитектурных паттернов. Теперь я начинаю с простых решений и усложняю систему только при появлении реальных потребностей.
А вы сталкивались с подобными ситуациями? Интересно узнать ваши истории про оптимальный выбор архитектуры для разных задач.
Комментарии (0)
iowanker
26.09.2025 07:30Сложность отладки — поиск ошибок в четырёх независимых сервисах
С одной стороны как бы да, микросервисы делают не в одно лицо, потому что это масштаб крупного нагруженного приложения, и у вас обычно есть по команде на сервис. С другой стороны - как раз проще, так как ограничивается зона влияния каждого сервиса, и не нужно курить весь код сразу в поисках, почему что-то сломалось. А уж если делать тесты...
Ресурсоёмкость — высокие требования к инфраструктуре
Опять же - если сервис для полутора инвалидов, и даже мысли нет, что понадобится делать более одной ноды для сервиса - ресурсы утекают, да. Вот только что делать, когда твой монолит под нагрузкой не влезает на одну доступную ноду вообще?))
Затраты на развитие — даже простые изменения требовали правки в нескольких сервисах
B снова - когда что-то пишешь для себя "на коленке", это простительно. Появилась идея - реализовал, не получилось - откатил, дело одного-двух вечеров. Вот только когда детский сад заканчивается, разработчиков становится больше пары друзей, встаёт вопрос планирования и согласования фич, уже нельзя просто взять и что-то сделать, особенно, когда твоя фича может помножить на ноль работу десятка людей. И тогда как раз трата некоторого времени на документирование, согласование, планирование - обеспечит отсутствие проблем.
В целом какой-то детский пост, "мне для домашней работы оно не понадобилось, значит оно не нужно"...
benjik
26.09.2025 07:30А вот взял бы go/rust и SQLite/DuckDB - смог бы в пару ГБ оперативки запихнуть 15-20 таких микросервисов, ещё бы и на nats/rabbitmq осталось, с графаной и Прометеем.
panzerfaust
26.09.2025 07:30ChatGPT, напиши историю о том, почему архитектурная «красота» не всегда означает практическую пользу.
Скоро люди отучатся выражать мнение своими словами даже в вопросе "который час?".oldzoomer Автор
26.09.2025 07:30Я ИИшницами пользуюсь для редактирования статьи. Большая часть текста - моя.
urvanov
Ну что тут сказать. Не всем нужен очередной AbstractSingletonProxyFactoryBean