Карго-культ 5 мин на чтение

Культ расчлененки

Запрещено для детей
Сезон
2
18+
Карго-культ
Безумный учёный собирает существо из Go,  Python-змеи и Rust-механизмов. На мониторах  ERROR 500: ВСЁ СЛОМАЛОСЬ. Попугай в углу:  «Я же говорил».
Когда Resume-Driven Development встречает продакшн

Ты нажимаешь кнопку «Оформить заказ» в интернет-магазине по продаже носков. Колесико загрузки крутится. Секунда. Две. Пять.
В старом добром 2010 году ты бы просто открыл лог сервера и увидел: NullPointerException в строке 42. Всё ясно, понятно, фикс занимает три минуты.

Сегодня? Добро пожаловать в ад распределенной трассировки.
Ты открываешь Jaeger, видишь 150 спанов, размазанных по 12 сервисам.
«Сервис корзины» сходил в «Сервис цен», который сходил в «Сервис скидок», но тот упал по тайм-ауту, потому что «Сервис логов» забил канал, а «Сервис уведомлений» вообще в бутлупе, потому что у него потекли горутины. В итоге виноват вообще «Сервис геолокации», который решили переписать на Rust ради эксперимента, и он теперь не понимает формат JSON от старого Java-сервиса.

Кто виноват? Никто.
Где ошибка? Везде.
Что делать? Перезагрузить кластер и помолиться.

Мы взяли один большой, понятный, работающий Монолит и превратили его в 500 маленьких кусков говна, которые падают по принципу домино. И мы гордо называем это «современной Cloud-Native архитектурой».

Вавилонская башня 2.0 и Закон Конвея

Главный миф микросервисов, который нам продают на конференциях: «Независимость».
Нам обещали: «Команда А может деплоить свой сервис, не спрашивая Команду Б! Полная свобода! Технологический агностицизм! Хотите писать на Haskell? Пишите!»

Реальность ударила нас по лицу Законом Конвея:

"Организации, проектирующие системы, ограничены дизайном, который копирует структуру коммуникаций в этой организации."

Мы думали, что микросервисы избавят нас от необходимости договариваться. Ха! Теперь, чтобы добавить одно поле user_id в заказ, тебе нужно:

  1. Согласовать контракт с командой юзеров.
  2. Согласовать контракт с командой биллинга.
  3. Согласовать контракт с командой нотификаций.
  4. Обновить 4 репозитория.
  5. Провести интеграционное тестирование, которое падает, потому что тестовый стенд биллинга лежит.

Мы не получили независимость. Мы получили Distributed Monolith (Распределенный Монолит).
Это худшее из двух миров: у вас есть все проблемы монолита (жесткая связность логики) плюс все проблемы распределенных систем (ненадежная сеть, задержки, частичные отказы, рассинхрон данных).

Вместо того чтобы просто вызвать функцию внутри процесса (наносекунды), мы шлем HTTP-запрос через пол-интернета (миллисекунды), сериализуем JSON, десериализуем JSON и молимся, чтобы сеть не моргнула. Мы заменили надежность вызова функции в памяти на веру в то, что TCP/IP — это магия, которая никогда не ломается. Спойлер: она ломается всегда.

📉 ЗАДЕРЖКА_СЧЁТ_V2.LOG [ТОЛЬКО ЧТЕНИЕ]
Сценарий А: Монолит
Вызов функции (в памяти) ~0.0005 мс
Стек вызовов: 12 строк. Отлаживаемо? ДА.
Сценарий Б: Микросервисы
Сетевой вызов (HTTP/REST) ~50.0000 мс
Сериализация / Десериализация ~5.0000 мс
Service Mesh Sidecar Proxy ~2.0000 мс
× 20 вызовов на один запрос пользователя
ИТОГО ОВЕРХЕД: МЕДЛЕННЕЕ НА 114 000%

Resume-Driven Development (RDD)

Зачем мы это делаем? Зачем стартапу с 1000 пользователей в день нужен Kubernetes кластер на 50 нод?
Зачем вам микросервисы, если весь ваш бэкенд пишут три человека, сидящих в одной комнате?

Ответ прост и циничен: Resume-Driven Development (Разработка, управляемая резюме).

Никто не хочет писать в резюме: "Поддерживал скучный монолит, который стабильно приносил бизнесу миллионы долларов". Это не секси. Вас не позовут на доклад. Вас не схантят в Big Tech.
Все хотят писать: "Архитектор высоконагруженных распределенных систем на Go, K8s, gRPC, Kafka, Service Mesh и GraphQL".

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

Бизнес платит за наше обучение. Мы сжигаем инвесторские деньги на облака, на оверинжиниринг, на бесконечный рефакторинг, называя это "борьбой с техническим долгом". Хотя на самом деле мы создаем техническую ипотеку с плавающей ставкой.


Франкенштейн в контейнерах

Микросервисная архитектура — это попытка собрать Франкенштейна. Мы берем руку, ногу, печень и селезенку. Кладем каждый орган в отдельный Docker-контейнер. Обвязываем их проводами (gRPC, Kafka, RabbitMQ) и заставляем танцевать.

Нога хочет сделать шаг, но ждет синхронного ответа от Мозжечка (который хостится в us-east-1).
Рука дергается в конвульсиях, потому что версия proto-файла у нее старая, и она не может распарсить ответ от Плеча.
А Сердце вообще написано на Rust хипстером, который уволился полгода назад. Никто не знает, как его пересобрать, поэтому образ контейнера heart:v0.1-alpha передается из поколения в поколение как священная реликвия.

Это не гибкость. Это расчлененка.

Разработчик в заляпанном халате распиливает монолит на микросервисы. На фоне горят Docker-контейнеры и YAML-файлы.
Даже Тоха понимает что это нужно собрать обратно

Самое страшное — это отладка.
В монолите ты ставил брейкпоинт. Ты видел стек вызовов. Ты понимал состояние памяти.
В микросервисах брейкпоинтов нет. Есть логи. Миллиарды строк логов.
"User not found".
Где? В каком сервисе? Почему? Может, база реплицировалась с задержкой? Или кеш Redis протух? Или топик Кафки забился?
Ты не программист. Ты детектив, расследующий убийство здравого смысла, имея на руках только разрозненные улики из ELK-стека.

Я не разработчик — я сисадмин. Я не пишу микросервисы, я их поднимаю, мониторю и чиню. Это другой угол. Иногда более честный.

И вот что я скажу: рассинхрон состояния в распределённой системе — это не теоретическая проблема из учебника. Однажды мы с напарником просидели всю ночь над AD-репликацией между основным и дополнительными контроллерами домена. Логи врали. Симптомы указывали в десять разных сторон. Оказалось — пароль для репликации не засинкался: он поменялся в момент синхронизации, и всё тихо развалилось. Не взрыв. Тихий рассинхрон.

Под утро мы смеялись. Нехорошим таким смехом.

Это не история про кубернетес. Это история про то, как распределённые системы падают — молча, бочком, и всегда не там где ищешь.

Налог на DevOps (The Complexity Tax)

Микросервисы — это налог. Огромный, скрытый налог на сложность.
За каждое разделение сервиса вы платите:

  • Инфраструктурой: Вам теперь нужен Kubernetes, Service Mesh (Istio/Linkerd), Prometheus, Grafana, Jaeger, Vault... Вам нужна команда из 5 DevOps-инженеров с зарплатой выше, чем у разработчиков, просто чтобы поддерживать этот зоопарк живым. Статистика говорит, что "DevOps Tax" съедает до 25% облачного бюджета и ресурсов команды.
  • Согласованностью данных: Distributed Transactions? Saga Pattern? Two-Phase Commit? Забудьте про ACID. Добро пожаловать в мир Eventual Consistency, где "согласованность в конечном счете" означает "может быть, когда-нибудь, если повезет". У пользователя деньги списались, а заказ не создался. Почему? Потому что событие OrderCreated потерялось в брокере сообщений.
  • Когнитивной нагрузкой: Ни один человек в компании больше не понимает, как работает ВСЯ система. У каждого в голове только свой маленький кусочек пазла. Архитектурная схема на стене похожа на карту звездного неба, нарисованную сумасшедшим астрономом.

СЧЕТ ЗА "ПРОГРЕСС"

Наименование услуги Цена
AWS EKS Cluster (Control Plane) $1 400 / мес
Kafka Managed (MSK) $2 500 / мес
Datadog Monitoring (Logs + APM) $5 000 / мес
DevOps Team (3 чел) $30 000 / мес
Потерянные нервные клетки TechLead Бесценно
ИТОГО: $38 900 / мес
*Для сравнения: VPS с монолитом стоит $40/мес.

Забытое искусство: Модульный Монолит

Хватит врать себе. Тебе не нужен Netflix-scale, если ты не Netflix. Тебе нужна архитектура, которая помещается в голову одного тимлида.

Есть элегантное решение, которое мы потеряли в погоне за хайпом: Модульный Монолит.
Это не тот спагетти-код из 2010-го. Это когда ты пишешь хороший, чистый код внутри одного приложения, но с жесткими границами модулей (Bounded Contexts).

В чем кайф:

Деплой — один артефакт, пять минут, простой пайплайн. Не десять YAML-файлов и молитва.

Отладка — один брейкпоинт. Ты видишь весь путь запроса. Без Jaeger, и даже без карт Таро. Магия, не иначе.

Транзакция либо прошла целиком, либо откатилась. Без "потерянных событий" и рассинхрона.

И тебе не нужна команда из пяти админов чтобы всё это не упало.

Микросервисы — это вынужденная мера. Это как химиотерапия: ты применяешь её, когда физически не можешь жить иначе (например, когда 500 разработчиков блокируют друг друга в одном репозитории).
Но если у тебя команда из 10 человек, начинать с микросервисов — это как покупать сочлененный автобус-гармошку, чтобы возить свою задницу в офис. Можно? Можно. Но парковаться замучаешься, и бензина жрет много.

Остановите безумие

Перестаньте расчленять свой код ради моды.

Я поднимал кластеры для больших проектов. Там это оправдано — сотни разработчиков, реальная нагрузка, команды которые физически не могут работать в одном репозитории. Кубернетес там не хайп, там необходимость. Я за него. Но именно там.

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

Сложность — это не признак крутизны.
Круто — это спать спокойно, а не бегать в воплями «Где? Где ошибка?».

Бизнесу не нужны замки. Бизнесу нужно чтобы кнопка «Купить» работала.

P.S. А сколько вы платите за свой кластер, который простаивает 90% времени?


Связанные данные

🔞 Внимание, путник!

Контент здесь может содержать ненормативную лексику, сарказм и правду жизни. Тебе уже есть 18 лет?

* Нажимая «Да», вы подтверждаете отсутствие медицинских и моральных противопоказаний к восприятию ненормативной лексики, черного юмора и сатиры. Администрация не оплачивает услуги психотерапевта.