Что такое распределенный монолит и каковы причины его появления?

Ответ

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

Причины возникновения:

  • Неудачная миграция на микросервисы: Команда начинает разделять монолит, но не может правильно определить границы доменов, что приводит к частым синхронным вызовам между новыми сервисами.
  • Сильная связанность (High Coupling): Сервисы напрямую зависят от внутренних деталей реализации друг друга, часто через синхронные HTTP/RPC вызовы для выполнения одной бизнес-операции.
  • Общая база данных: Несколько сервисов работают с одной и той же схемой базы данных, создавая неявные зависимости и усложняя независимое развертывание.

Основные проблемы:

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

Ответ 18+ 🔞

Ну вот, сидишь такой, думаешь: "А давайте сделаем микросервисы, это же модно, это же масштабируется!" А в итоге получается этакая архитектурная химера, хуй с винтом, под названием распределённый монолит.

Представь: ты взял здоровенный, единый кусок кода (монолит), и просто раскидал его по разным сервисам, которые друг без друга нихуя не могут. Вроде бы они отдельно живут, а на деле — одна семья, только в разных комнатах, но с общей кухней и одним туалетом на всех. И если кто-то в этом туалете засорит, то всем пиздец.

Откуда эта хрень вообще берётся?

Чаще всего, когда команда, не разобравшись, начинает пилить монолит, как бог черепаху. Вместо того чтобы чётко выделить независимые бизнес-домены, они просто механически отрезают куски. Получается, что для выполнения одной простой операции, типа "оформить заказ", один сервис должен позвонить другому, тот — третьему, а третий — четвёртому. И все они синхронно, по HTTP, друг у друга чего-то спрашивают. Это ж ебаный колл-центр, а не архитектура!

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

И чем же это всё так пиздецово?

  1. Всё падает каскадом. Один сервис чихнул — и по цепочке все остальные начинают кашлять и дохнуть. Отказоустойчивость — ноль ебать. Вместо изоляции сбоев ты получаешь их гарантированное распространение.
  2. Развернуть что-то — это квест. Нельзя просто так взять и обновить один сервис. Потому что он намертво сцеплен с другими. Приходится координировать релизы, как высадку десанта. Терпения ноль ебать.
  3. Медленно, блядь. В монолите вызов был просто прыжком по памяти. А тут — сетевая рулетка: латенси, таймауты, ретраи. Вся производительность съедается этими чатами между сервисами.
  4. Пойди разберись, что сломалось. Трассировка одного запроса превращается в детективную историю с двадцатью подозреваемыми. Отладка — это пиздец и боль. Тестировать такую систему — отдельный вид мазохизма.

Короче, получается худшее из двух миров: все сложности микросервисов (сеть, распределённые транзакции, оркестрация) и все недостатки монолита (жёсткая связанность, хрупкость, общие зависимости). Распределённый монолит — это как взять свою старую "девятку", приварить к ней крылья от "кукурузника" и надеяться, что она полетит. Не полетит, чувак. Она развалится нахуй ещё на взлётной полосе.