Монолит vs Микросервисы

Почему Netflix использует монолиты для критических систем

15 мая 2024

Гайд по выбору

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

Скрытые издержки микросервисов

Стоимость сетевых вызовов

Каждая граница сервиса добавляет:

Микросервисы:                      Монолит:

[Client] -> [API Gateway]          [Client] -> [Monolith Cluster]
               |                                  |
          [Service A]                    (Internal function calls)
               |                                  |
          [Service B]                          [DB]
               |
          [Service C]
               |
             [DB]

Каждый сетевой переход между сервисами добавляет задержку и операционную нагрузку. Монолит маршрутизирует вызовы внутри памяти - быстрее, дешевле, проще.

Сложность эксплуатации

Каждый новый сервис требует:

Реальность: 50 микросервисов = 50 CI/CD пайплайнов, 50 наборов алертов, 50 потенциальных точек отказа.

Сложности отладки

То, что раньше было одним вызовом функции, теперь - distributed trace через десятки сервисов. Найти причину проблемы в цепочке из 20 сервисов значительно сложнее, чем в стектрейсе монолита:

Модульный монолит как альтернатива

Между монолитом и микросервисами существует промежуточный вариант - модульный монолит. Код организован в изолированные модули с четкими границами и контрактами, но деплоится как единое приложение. Это дает:

Shopify - один из известных примеров успешного модульного монолита на Ruby on Rails, обслуживающего миллионы магазинов.

Учебный пример: критичный сценарий

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

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

Почему индустрия это упустила

1. Популярность подхода

Микросервисы стали восприниматься как единственный «правильный» подход. Вопрос «а подходит ли это нам?» стал задаваться все реже.

2. Устройство команд и системы

Микросервисы решают проблему масштабирования команд, не всегда - масштабирования систем. Это разные проблемы.

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

3. Выбор примеров для конференций

На конференциях рассказывали об успешном переходе на микросервисы. Опыт сохранения монолитной архитектуры обсуждался реже. Никто не выступает с докладом "Мы не перешли на микросервисы и у нас все хорошо".

Как выбрать подход

Вопрос 1: Сколько у вас команд?

Одна команда?
└── Предпочтите монолит
    • Быстрее итерации
    • Проще операции
    • Меньше координации

Много команд?
└── Микросервисы могут уменьшить friction
    • Независимые деплои
    • Автономия команд
    • Чёткие границы владения

Вопрос 2: Что является bottleneck - трафик или люди?

Bottleneck - трафик?
└── Монолит часто выигрывает
    • Меньше сетевых переходов
    • Проще масштабирование
    • Ниже латентность

Bottleneck - люди?
└── Микросервисы могут помочь
    • Независимая работа команд
    • Меньше merge conflicts
    • Быстрее onboarding в отдельный сервис

Матрица решения

Мало команд Много команд
Bottleneck - трафик Монолит Модульный монолит или крупные сервисы
Bottleneck - люди Монолит (пока) Микросервисы

Резюме

Монолит - рабочая отправная точка. Переход к микросервисам оправдан при реальных проблемах масштабирования команд, а не как ответ на моду.

Источники