Ответ
High Cohesion (Высокая связность) и Low Coupling (Низкое зацепление) — это два фундаментальных принципа проектирования программного обеспечения, которые особенно важны при разработке микросервисов. Они помогают правильно определить границы сервисов.
High Cohesion (Высокая связность)
High Cohesion означает, что все компоненты внутри одного микросервиса (код, данные, логика) тесно связаны друг с другом и служат одной четко определенной бизнес-цели. Сервис должен быть сфокусирован на одной задаче и делать ее хорошо.
- Признак хорошей связности: Если для реализации нового бизнес-требования вам нужно изменить код только в одном сервисе, скорее всего, у него высокая связность.
- Признак плохой связности: Если сервис выполняет множество несвязанных функций (например, управляет и профилями пользователей, и биллингом, и доставкой товаров), у него низкая связность (cohesion).
Low Coupling (Низкое зацепление)
Low Coupling означает, что микросервисы должны быть максимально независимы друг от друга. Изменение в одном сервисе не должно требовать каскадных изменений в других сервисах. Связи между сервисами должны быть минимальными и четко определенными (например, через стабильный API).
- Признак низкого зацепления: Вы можете развернуть новую версию одного сервиса, не затрагивая и не развертывая другие сервисы (при условии сохранения обратной совместимости API).
- Признак высокого зацепления: Сервисы напрямую обращаются к базам данных друг друга или сильно зависят от внутренних деталей реализации других сервисов.
Пример:
Представим e-commerce приложение.
Плохой дизайн (Low Cohesion, High Coupling):
Один большой сервисMonolithService
, который управляет пользователями, заказами, платежами и уведомлениями.Хороший дизайн (High Cohesion, Low Coupling):
Система разбита на несколько сфокусированных микросервисов:AuthService
: отвечает только за аутентификацию и авторизацию.OrderService
: управляет жизненным циклом заказов.PaymentService
: обрабатывает платежи.NotificationService
: отправляет email и push-уведомления.
Эти сервисы взаимодействуют друг с другом через четко определенные API (например, OrderService
асинхронно сообщает NotificationService
о необходимости отправить уведомление), но остаются независимыми в своей реализации и развертывании.