Переход от монолита к микросервисам

Проблематика больших монолитных систем

  • Плохое горизонтальное масштабирование
  • Плохая отказоустойчивость
  • Сложность внедрения новых технологий
  • Сложность рефакторинга legacy

Сравнение монолита и микросервисов

Монолит Микросервисы по доменам
Монолит Микросервисы по доменам
Плюсы Минусы
Горизонтальное масштабирование только нужных частей Дополнительная сложность в тестировании и развёртывании
Отказоустойчивость Выше начальная стоимость
Масштабирование команд Не всегда согласованные данные
Гибкость стека Бывает трудно провести границу между сервисами

Вам не нужны микросервисы, если

  • Вы делаете стартап (MVP)
  • Нет или не предполагается рост нагрузки
  • Нет плана, как порезать сервисы на слабосвязанные;
  • Нет людей, которые могут реализовать процесс внесения изменений.

Вам нужны микросервисы, если

  • Высокая нагрузка
  • Система растет
  • Команда растет
  • Нужна отказоустойчивость
  • Необходимо сократить TTM

Разбиение

Не разрезайте по слоям, разрезайте по бизнес-контекстам

Размер сервиса

Размер сервиса выбирается

  • на основе бизнес-контекста;
  • на основе сетевых запросов (чем меньше, тем лучше);
  • на основе транзакций (транзакция внутри одного сервиса).

База данных

Каждый сервис взаимодействует со своими базами данных (если требуется). Выбор движка зависит от задачи. В идеале сервис должен быть без сохранения состояния (в литературе StateLess).

Взаимодействие между сервисами

Асинхронное на основе сервиса очередей (брокера сообщений). Протокол обмена сообщениями основан на независимом от вендора стандарте.

Проблемы обмена сообщениями и решения

Проблемы:

  • Нет ACID-транзакций;
  • Возможна несогласованность.

Решение: На сервере внутри реляционной субд (Postgres, к примеру) сохраняются транзакции с собственным ID события. Транзакция удаляется, только если она доставлена. Если транзацкция не доставлена, нужно сделать повтор операции. Давние события игнорируются.

Трассировка

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

Можно воспользоваться готовым решением, например, https://opentracing.io/

Развёртывание

Виртуальная машина Контейнер + оркестрация (k8s)
AutoScaling – вручную AutoScaling – из коробки
AutoDiscovery – вручную AutoDiscovery - из коробки
Изоляция по ресурсам из коробки Балансировка - из коробки

Выводы

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