Монолит vs Микросервисы
Есть вопрос, который в IT почти не задают. Все знают: микросервисы лучше. Монолит - это легаси. Надо дробить. Надо масштабировать. Надо автономию команд. Это - мантра. Её повторяют на конференциях. Пишут в вакансиях. Вкладывают в архитектурные решения.
Но почему никто не спрашивает: а когда монолит лучше? Не "был лучше в 2005". А сейчас. В конкретной системе. В конкретной команде. В конкретном продукте. Где граница. После которой монолит перестаёт работать. И до которой он работает лучше, чем любая распределённая система.
Граница есть. И она не про размер. Не про нагрузку или деньги. Она про сложность. Которую можно удержать в голове.
У монолита есть свойства. Он быстрый. Потому что вызов - это функция. А функция не идёт по сети. Она не падает. Не таймаутится. Не требует ретраев. Она просто выполняется или не выполняется. Но не "где-то там", а тут - все достаточно прозрачно. У микросервисов вызов - это сеть. А сеть - это физика. Даже быстрая и надёжная, но физика. И если цепочка короткая - монолит выигрывает. Просто потому, что нет накладных расходов.
Монолит проще. Одна база. Один процесс. Одна точка входа. Одна команда. Не надо договариваться о контрактах. Не надо версионировать API. Не надо синхронизировать релизы. Просто код. И одна ответственность. И если команда маленькая - это работает "на ура". Лучше, чем любая оркестрация.
Монолит предсказуем. Он не масштабируется горизонтально. Но если спрос не растёт - горизонтальное масштабирование не нужно. А если спрос падает - не нужно платить за лишние экземпляры. Потому что экземпляр один. И он либо справляется, либо нет. Без промежуточных состояний.
Но есть точка, где монолит начинает проигрывать. И эта точка - не в количестве строк. Не в количестве пользователей. Не в количестве транзакций. Она в количестве изменений, которые нужно вносить одновременно. Если изменения касаются одной части - монолит справляется. Если разных - он требует пересборки всего. А это риск. Это долго, это подчас страшно. И тогда появляется соблазн: давайте разделим.
И вот здесь - ключевой момент. Разделение - не про технологию. Оно про границы, которые нужно провести. Где заканчивается одна ответственность и начинается другая? Где одна команда может работать, не зная, что делает другая? Где изменение в одной части не ломает другую? Я сейчас не про сервисы. Это про людей. Про то, сколько людей может работать параллельно, не мешая друг другу. Монолит работает, пока система помещается в голову одной команды. Пока один человек (или даже несколько) могут держать в уме всю картину, все связи, все зависимости и все последствия.
Как только перестаёт помещаться - монолит начинает трещать. Не потому что плохой, а потому что голова - не бесконечная, а система - больше, чем голова. И тогда - только граница. Не "когда монолит плохой". А "когда он перестаёт быть удерживаемым". Это - не про размер. Это - про сложность. Про количество связей. Про количество изменений. Про количество людей, которые должны договориться. И если не договорятся - монолит не спасает. Он просто становится медленным. И хрупким.
Знаете что напоминает? СССР. Я сейчас со всем искренним должным уважением.
Но СССР сейчас у меня не как политика. Как архитектура - монолит без границ. Центр, который должен был держать всё. Потому что автономии не было. Не потому что злые, а потому что архитектура не предполагала. Монолит не предполагает границ. Он предполагает центр. А центр не может держать двадцать два миллиона квадратных километров. Физически. Просто потому что сигнал идёт долго. А обратная связь - ещё дольше.
К чему я тут прописные истины пишу? Возник сегодня вопрос про "микросервис vs монолит" в одном проекте. Переписывать "не хотелось" команде. Пришлось объяснять на пальцах не "что лучше", а "где граница". Так и пост родился.
Граница - не в технологии, размере или нагрузке. Она в сложности, которую можно удержать одной головой, одной командой, одним центром.
Как только сложность превышает пора делить. Не потому что модно, а потому что иначе - не удержать. Ни в голове, ни в руках, ни в системе.
Чек-лист - в комментарии.
· 22.09
Простой чек-лист, сработавший сегодня как доказательная база. Хотя как доказательная - команда сама себе доказала, что их монолит подлежит разбору по кирпичикам.
1. Можем ли мы за 5 минут нарисовать полную схему зависимостей текущей системы без документации?
2. Сколько человек должны одобрить PR, чтобы изменить логику оплаты? Если больше двух - границы размыты.
3. Как часто релизы откладываются из-за конфликтов в смежных фичах?
4. Есть ли модули, которые никто не хочет трогать ("боевой", "старый", "там мины", "там живут драконы")? Это кандидаты на выделение.
5. Хотят ли две части продукта развиваться с разной скоростью? Например, админка стабильно, а клиентский API - каждую неделю.
Ответили? Ну а теперь просто: есответов три или более - засучиваем рукава и распиливаем монстра на части. И лучше раньше начать, потому как потом придется пилить еще больше.
0
ответить
коммент скрыт — часть юзеров считает его токсичным или некорректным
коммент удалён
· 23.09
Вы точно правы в одном: границы важнее технологий.
Только давайте посмотрим с другой стороны - после того как уже создали микросервисный проект или распилили монолит?
Чтобы не перегружать комментарии выделил у себя в Сетке отдельный пост для этого (прочитать можно тут https://setka.ru/posts/01a0ce34-2454-7780-ad28-b37c42902455). в котором ответил на 5 вопросов Вашего чек-листа, только со стороны уже готового "микросервисного" проекта. А так же предложил решение более интересное, на мой взгляд.
В комментарии моего поста есть ссылка на мой сайт на полную версию, т.к. Сетка ограничивает символы поста. Было бы интересно услышать Ваши комментарии. (;
0
ответить
коммент скрыт — часть юзеров считает его токсичным или некорректным
ответ удалён
· 23.09
Прочитал, и да. Вы правы.
Но я поясню в чем - расписанный Вами пулл ответов подразумевает реальную ситуацию в компании без стандартов разработки. Это не вырожденная ситуация - также как и Вы работаю с чужим легаси и насмотрелся всякого. Больше ответов здесь: https://tzlab.pro. :)
Обратите внимание, что 4 из 5 пунктов сводятся к тому, что в компании образно говоря правая рука не в курсе что делает левая, а документация - набор заметок в блокноте, что-то в вики, что-то на гугл-доке в описательной форме с (не к ночи помянуто будет) прилагательными.
К слову о модульных монолитах.Да, это действительно решение, но более сложное в плане реального рефакторинга, нежели выделение на микросервисы из одного большого куска легаси. Если не уметь строить границы в монолите (или модульном монолите), не построишь их и в микросервисах.
До боли знакомая ситуация. Жму Вам руку, коллега по опасному бизнесу.
Описанный же мной кейс не касался хаоса в управлении. Он описывал лишь подход к выбору.
0
ответить
коммент скрыт — часть юзеров считает его токсичным или некорректным
ответ удалён