Что такое High Cohesion применительно к микросервисной архитектуре?

Ответ

High Cohesion (высокая связность) в контексте микросервисной архитектуры означает, что каждый микросервис должен быть сфокусирован на выполнении одной четко определённой бизнес-возможности (business capability) или поддомена (bounded context). Все его компоненты (код, данные, конфигурация) тесно связаны между собой и работают для достижения этой единой цели.

Принцип на практике:

  • Сервис "Заказы" (Order Service) отвечает только за жизненный цикл заказа: создание, изменение статуса, история.
  • Сервис "Оплата" (Payment Service) отвечает только за обработку платежей и взаимодействие с платёжными шлюзами.
  • Сервис "Доставка" (Shipping Service) отвечает только за логистику и отслеживание посылок.

Преимущества High Cohesion в микросервисах:

  1. Упрощение понимания и разработки: Разработчик работает в чётко очерченном контексте.
  2. Независимое развёртывание: Изменения в сервисе "Заказы" не требуют пересборки и перезапуска сервиса "Оплата".
  3. Гранулярное масштабирование: Можно масштабировать только тот сервис, который испытывает высокую нагрузку (например, "Оплата" в час пик).
  4. Повышение отказоустойчивости: Сбой в одном сервисе не обязательно приводит к падению всей системы.

Как достичь High Cohesion? Применяя Domain-Driven Design (DDD) для выявления bounded context и следуя Принципу единственной ответственности (SRP) на уровне сервиса. Сервис должен меняться только по одной причине — из-за изменений в его конкретном бизнес-домене.

Ответ 18+ 🔞

Э, слушай, давай разберёмся с этой вашей "высокой связностью", а то как будто на дворе 2002-й год и все только про модульные монолиты говорят.

Представь, что у тебя есть три чувака в одной квартире-коммуналке. Один — Сервис "Заказы". Его работа — только заказы. Получил заявку, создал ордер, статус поменял — всё, его дело сделано. Он не лезет в холодильник к соседу, не пытается посчитать сдачу и уж тем более не знает, как доставлять посылку до Урюпинска. Его контекст — заказ, и всё, ебушки-воробушки. Чётко, ясно, ни хуя себе как просто.

Второй — Сервис "Оплата". Это тот самый тип, который только про деньги и думает. Карты, шлюзы, инвойсы, откаты транзакций — его вотчина. Ему да похуй, что заказали — пиццу или бульдозер. Его работа — деньги списать или вернуть. И всё.

Третий — Сервис "Доставка". Ну, тут и ежу понятно: треки, склады, курьеры, маршруты. Он знает, где сейчас твой заказ, но понятия не имеет, сколько за него заплатили.

Вот это и есть High Cohesion, ёпта. Каждый сервис — как хитрая жопа, которая знает своё место и делает только своё, одно, но овердохуища хорошо. Не лезет в дела других, не создаёт бардак.

А теперь, почему это круто, а не просто модное словечко:

  1. Разработчику проще. Не нужно держать в голове всю систему, как будто ты гугл-карты. Зашёл в свой сервис — и ты в своей песочнице. Твой контекст, твои правила. Волнение ебать — ноль.
  2. Задеплоить можно по одному. Поправил баг в "Оплате"? Выкатил только её. Не нужно всю эту махину из 50 сервисов пересобирать, терпения ноль ебать на это.
  3. Масштабируется точечно. Чёрная пятница, все платят? Гони побольше инстансов "Оплаты"! А "Доставка" пусть себе потихоньку работает. Не нужно всю систему раздувать, как пузырь.
  4. Отказоустойчивость. Если "Доставка" накрылась медным тазом на полчаса, это не значит, что люди перестанут делать заказы или платить. Система-то жива, просто одна функция временно в ауте.

Как этого добиться? Да не выдумывать велосипед, бля. Берёшь Domain-Driven Design (DDD), находишь эти самые bounded context'ы (границы ответственности, проще говоря) и для каждого лепишь свой микросервис. И следишь, чтобы он следовал Принципу единственной ответственности (SRP), но уже на уровне сервиса. Меняться он должен только по одной причине — если поменялись требования именно в его зоне, в его домене. Не потому что в соседнем что-то поменялось, а потому что тут бизнес-логику переписали.

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