Rain Lag

Атлас аналоговых зависимостей: как отрисовать границы системы до того, как вы добавите ещё один микросервис

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

Атлас аналоговых зависимостей: как отрисовать границы системы до того, как вы добавите ещё один микросервис

Вам не нужен ещё один микросервис.

По крайней мере, до тех пор, пока вы по‑настоящему не понимаете систему, которая у вас уже есть.

Команды часто тянутся к новому сервису как к решению «по умолчанию» для масштабирования, производительности или снятия организационного трения. Но когда ваш ландшафт уже представляет собой клубок API, очередей, шлюзов и сторонних SaaS‑сервисов, добавление «ещё одного маленького» может незаметно повысить хрупкость вместо устойчивости.

Здесь и нужен Атлас аналоговых зависимостей — осознанная практика отрисовки от руки вашей экосистемы и её границ до того, как вы добавите что‑то новое.

Ручка и бумага могут звучать архаично в мире авто‑генерируемых карт сервисов, но именно они помогают увидеть зависимости, которые инструменты не видят, предположения скрывают, а инциденты потом болезненно проявляют.


Почему начинать с «аналога» в цифровом мире?

Графы зависимостей, платформы наблюдаемости и архитектурные дашборды полезны — но они не нейтральны. Они показывают только то, под что настроены. Они отражают:

  • события, которые логируются
  • метрики, которые собираются
  • интеграции, которые кто‑то вспомнил настроить

Они редко отражают всю реальную систему, которую вы запускаете.

Карты, нарисованные от руки, работают иначе:

  • Они заставляют думать, а не только смотреть.
  • Они поднимают на поверхность неявные знания, которые живут в головах людей.
  • Они показывают дыры в понимании — в виде отсутствующих прямоугольников и неподписанных стрелок.

Результат — это не красивая диаграмма. Результат — это разговор: разделённое всеми, системное понимание, которое становится вашей первой защитой от случайно созданной сложности.


Шаг 1: Проведите инвентаризацию всей экосистемы (а не только «сервисов»)

Чтобы рисовать зависимости, нужно понять, что вообще существует. Это значит выйти за пределы микросервисов и зафиксировать всю среду.

Составьте полный инвентарный список:

  • Приложения
    Веб‑приложения, мобильные приложения, внутренние инструменты, админки, cron‑джобы.

  • Микросервисы и API
    Публичные сервисы, внутренние сервисы, edge‑сервисы, легаси‑эндпоинты.

  • Хранилища данных
    Базы данных (SQL/NoSQL), data warehouse, кэши, очереди сообщений, объектное хранилище.

  • Вычислительные платформы
    Сервера, VM, контейнеры, кластеры Kubernetes, serverless‑функции.

  • Промежуточное ПО и интеграционные слои
    Брокеры сообщений, ESB, ETL‑инструменты, движки бизнес‑процессов/воркфлоу.

  • Сетевые и API‑границы
    API‑шлюзы, балансировщики нагрузки, reverse‑proxy, service mesh.

  • Удостоверения и доступ
    SSO‑провайдеры, системы IAM, менеджеры секретов.

  • Сторонние SaaS и внешние сервисы
    Платёжные провайдеры, SMS/e‑mail‑сервисы, аналитика, логирование, feature‑flag‑системы.

Этот список должен казаться слишком длинным. В этом и смысл.

Без такой инвентаризации любая карта зависимостей — в лучшем случае частичная правда, а в худшем — опасно вводящая в заблуждение. Когда случаются инциденты или изменения идут не так, корень проблемы часто в «невидимом» компоненте: очереди, о существовании которой никто не помнил, старом маршруте в шлюзе, который до сих пор используется, или стороннем сервисе, который постепенно стал критически важным.


Шаг 2: Охотьтесь за скрытой инфраструктурой

Самые опасные компоненты вашей системы — те, о которых почти не говорят:

  • Промежуточное ПО, которое тихо трансформирует или обогащает сообщения
  • API‑шлюзы, которые применяют аутентификацию, троттлинг и правила маршрутизации
  • Унаследованные прокси, сохранённые «для обратной совместимости»
  • Общие базы данных, к которым ходит несколько сервисов

Эти компоненты несут неочевидные зависимости:

  • Таймаут на шлюзе может выглядеть как «ломается сервис X», тогда как настоящая проблема — на периметре.
  • Изменение схемы общей базы может сломать несколько сервисов, о зависимостях которых вы не подозревали.
  • Правило в middleware может навязывать поведение, которое вы считаете реализованным в коде микросервиса.

Обращайте особое внимание на эти скрытые слои, когда рисуете. Для каждого задайте вопросы:

  • Кто зависит от этого компонента?
  • Кто им владеет (есть ли вообще владелец)?
  • Что произойдёт, если он откажет или изменится?

Часто на вопрос «кто за это отвечает?» ответом становится тишина или перекладывание ответственности. Эта тишина — сигнал: перед вами системный риск, а не просто пункт техдолга.


Шаг 3: Рисуйте от руки до того, как откроете диаграммный редактор

Теперь — действительно рисуйте.

Сдержите порыв открыть любимый онлайн‑редактор диаграмм. Начните с бумаги, стикеров или доски. Цель — открытие нового, а не красивая документация.

Как нарисовать ваш Атлас аналоговых зависимостей

  1. Нарисуйте прямоугольники для всего из инвентаризации
    Каждый прямоугольник — это компонент: сервис, база данных, шлюз, очередь, SaaS‑сервис.

  2. Соедините их стрелками для реальных зависимостей

    • «Сервис A вызывает сервис B по HTTP»
    • «Сервис C пишет в базу D»
    • «Веб‑приложение использует провайдера идентификации E для логина»
  3. Подпишите стрелки протоколами и семантикой

    • REST / JSON, gRPC, Kafka, S3, Webhooks и т. п.
    • Синхронно vs асинхронно
    • Критический путь vs best‑effort
  4. Выделите внешние границы
    Нарисуйте жирную линию вокруг вашей организации. Всё, что снаружи, — внешняя зависимость со своей надёжностью, SLA и паттернами изменений.

  5. Явно помечайте неизвестное
    Ставьте вопросительные знаки там, где вы не уверены, кто с кем и как общается. Эти неизвестные превращаются в задачи, а не в загадки.

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

И только после этого неаккуратного аналогового этапа стоит подумать о том, чтобы формализовать часть схемы в цифровом инструменте.


Шаг 4: Определите владение и границы для каждого сервиса

Микросервис без понятного владельца — это просто распределённое обязательство.

Чтобы архитектура микросервисов реально давала пользу, для каждого компонента нужно ответить:

  • Кто владеет этим сервисом?
    Название команды, а не человека. Владелец отвечает за доступность, изменения и развитие.

  • Какой у него bounded context?
    Какие доменные понятия он контролирует? За что он не отвечает?

  • Каков его контракт?
    Какие API, SLA, модели данных он предоставляет — и что гарантированно не изменится без координации.

Сравните это со многими монолитами:

  • Любой может менять любую часть кодовой базы.
  • Ответственность за сбои размыта: «упало приложение».
  • Связности спрятаны в общих библиотеках, глобальном состоянии и огромных реляционных схемах.

Монолиты часто страдают от неоднозначной ответственности. Микросервисы должны были это исправить, но исправляют только тогда, когда вы действительно проводите границы:

  • Один чётко названный владелец‑команда на сервис или группу сервисов.
  • Одна ясная системная граница на сервис.
  • Один ясный контракт, на который опираются остальные.

На вашей аналоговой карте подпишите каждый прямоугольник владельцем. Везде, где вы не можете указать команду, вы нашли:

  • Границу, которая на самом деле никем не владеется
  • Платформенный слой, ведущий себя как общий монолитный инфраструктурный компонент
  • Горячую точку риска, где изменения будут медленными, политизированными и хрупкими

Микросервисы против монолитов: ясность владения и зависимостей

В монолите:

  • Зависимости часто находятся на уровне кода: вызовы функций, общие модули, общие таблицы.
  • Увидеть их сложно без глубокого знания домена и кодовой базы.
  • Владелец вроде бы «вся команда владеет приложением», что звучит хорошо, но часто означает, что никто конкретно ни за что не отвечает.

В правильно построенной микросервисной экосистеме:

  • Зависимости межсервисные и контрактно‑ориентированные: API, события, схемы.
  • Они видимы на карте и (в идеале) в инструментах.
  • Владелец есть у каждого сервиса, что даёт более прозрачную ответственность и возможность быстрее развиваться.

Но если вы просто разрезаете монолит на более мелкие артефакты деплоя без чётких границ и владельцев, вы получаете:

  • Всю связность монолита
  • Весь операционный overhead микросервисов
  • Отсутствие ясности, кто за что отвечает

Ваш аналоговый атлас помогает задать ключевой вопрос:

Мы декомпозируем по домену и ответственности или просто по структуре каталогов и стеку технологий?


Шаг 5: Думайте как системный архитектор, а не как автор сервиса

Микросервисы — локальные решения. Инциденты и проблемы надёжности — явления глобальные.

Опираясь на идеи из теории сложных систем и оптимизации, вам нужно системное мышление:

  • Определите критические пути: какие цепочки сервисов и компонентов должны сработать, чтобы ключевой пользовательский сценарий (например, «оформить заказ») завершился успешно?
  • Найдите тугие связки: где изменение одного компонента тянет за собой изменения множества других?
  • Поймите петли обратной связи: ретраи, backoff, circuit breaker’ы и политики автоскейлинга могут создавать сложное «коллективное» поведение, вроде каскадных отказов.
  • Оцените компромиссы: новый микросервис может ускорить одну команду, но повысить стоимость межкомандной координации и системный риск.

Смотря на всю аналоговую схему, задавайте вопросы:

  • Если этот сервис замедлится, что начнёт очередь за ним?
  • Если тот SaaS‑провайдер упадёт, какие пользовательские сценарии станут невозможны?
  • Где у нас единственные точки отказа, замаскированные под «общие платформы»?

Только с таким системным пониманием вы можете честно решить, приведёт ли новый микросервис к:

  • реальному прояснению границ, или
  • просто к появлению ещё одной точки отказа и дополнительной координации.

Когда (и стоит ли вообще) добавлять следующий микросервис

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

  1. Есть ли чёткая новая граница?
    Инкапсулирует ли предполагаемый сервис цельный домен или способность, или вы просто режете код по техническим линиям?

  2. Есть ли понятный владелец?
    Есть ли команда, которая готова и хочет долгосрочно за него отвечать?

  3. Он снижает или увеличивает системную связанность?
    Вы выводите из эксплуатации старые зависимости или просто добавляете новые поверх существующих?

  4. Можете ли вы чётко описать его контракт на карте?
    Если API или модель событий описываются расплывчато, скорее всего, границы сервиса тоже размыты.

Если вы не можете уверенно ответить на эти вопросы, самым надёжным шагом может быть улучшить то, что уже есть, вместо того чтобы плодить новые сервисы.


Итог: сначала рисуйте, потом деплойте

Современные системы падают не потому, что нам не хватает инструментов, а потому, что нам не хватает общего понимания.

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

  • Вы проводите инвентаризацию всех компонентов, а не только модных микросервисов.
  • Вы вскрываете скрытую инфраструктуру и риски сторонних сервисов.
  • Вы проясняете владение и границы, чтобы у каждого прямоугольника на схеме была ответственная команда.
  • Вы мыслите на уровне системы, взвешивая компромиссы для всей экосистемы.

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

Атлас аналоговых зависимостей: как отрисовать границы системы до того, как вы добавите ещё один микросервис | Rain Lag