Почему вы думаете что справитесь с микросервисами если не можете справиться с монолитом?
Саймон Браун задал этот вопрос в 2014 году. Прошло 7 лет но вопрос до сих пор актуален.
Если вы используете микросервисы для того чтобы решить проблему с нагрузкой или справиться со сложностью монолита — скорее всего вы стреляете себе в ногу.
Почему не стоит решать проблему высокой нагрузки через микросервисы
Сервер не справляется с нагрузкой. Ахтунг, у нас хайлоад! 🔥 🔥 🔥
Ничего, сейчас распилим на микросервисы и отмасштабируем и проблема нагрузки решится. 😎
Знакомо?
Микросервисы как решение высокой нагрузки это очень сомнительно, потому что за микросервисы придётся платить, и платить серьёзно. О минусах достаточно написано, не буду повторяться, но именно сложность перехода и поддержки микросервисов является расплатой.
Что же тогда делать если нагрузка выросла? Найти узкое место.
В 99% случаев проблема решается поиском и изучением тормозящего участка, и далее:
-
Возможно это кривой код — исправляем, всё летает;
-
Тормозит SQL запрос — оптимизируем его, всё летает;
-
Долгие операции или ожидающие ответа от внешних систем — складываем в очередь, обрабатываем параллельно воркерами, всё летает;
-
Не вывозит БД — перепроектирование схемы, репликация, кеширование, вынос БД на другой сервер, в крайнем случае шардинг.
Расшили узкое место, избавились от тормозов, остались в монолите.
Хайлоад это точно не то ради чего стоит внедрять микросервисы. Если у вас не гугл и не амазон вы можете решить хайлоад и без микросервисов.
Почему не стоит решать проблему высокой связанности (coupling) через микросервисы
Часто вижу что микросервисы подаётся как единственное решение для уменьшения сложности монолита.
Просто потому что других способов люди не знают, а про микросервисы знают все, это же хайп 😏
Но есть другое решение — разделить монолит на модули.
Получится “модульный монолит”, с низкой связанностью между модулями. При этом он останется монолитом и сохранит все плюсы монолита.
Нельзя же просто выдернуть кусок кода из монолита в микросервис, его надо каким-то образом отделить, чтобы ничего не сломать, сначала как-то изолировать. Вот изолируя части мы и получим модули.
Сейчас для деления на модули модно использовать DDD и deptrac (PHP), но можно справиться и без них.
“Модульный монолит” это первый и промежуточный шаг от “большого кома грязи” к микросервисам. Делим на модули, потом запускаем отдельно модуль и получаем микросервис.
Более того, сделав этот шаг может выясниться что все проблемы которые пытались решить микросервисами, уже в принципе решены модульным монолитом и его вам достаточно. Что вам уже и так хорошо)
Именно так получилось в команде iSpring, вот доклад про это от Юлии Николаевой (Insolita), очень рекомендую к просмотру.
Проблема высокой связанности монолита прекрасно решается без микросервисов.