Принцип каскадного снижения связанности
ноябрь, 2024
Руслан
Сафин
Технический директор и партнёр
Бындюсофт
3
Часто ли вы слышите о новом принципе проектирования IT-архитектуры?
А об обновлении классических принципов?
Попробую вас удивить и привнести что-то новое.
Coupling & Cohesion
Связанность и прочность��1974 Larry Constantine, Glenford Myers, Wayne Stevens �IBM Systems Journal — Structured Design
декабрь, 1974
��к 50-летию статьи
5
6
И то, и другое — некая связь компонента, отличается только угол зрения.
У вас не вызывает недоумения, что одно — хорошо, а другое — почему-то плохо?
Coupling
Связанность (зацепление, сцепление, сопряжение)
Связанность
8
Cohesion
Прочность (связность, сплоченность, сцепленность)
Прочность
10
11
Да, но
?
Да, но
13
?
Уровни компонентизации архитектуры выше микросервисов
14
А в больших энтерпрайзах?
15
Связанность становится прочностью!
Вопрос лишь в том, как мы начертим границы
Сложность
Разберем на примерах
19
Микросервисы
–
Контексты микросервисов
–
Продукты
20
Связанность контекстов
21
22
Прочность продуктов (систем)
23
Один и тот же набор зависимостей является связанностью на одном уровне рассмотрения архитекутры и прочностью на другом!
Вижу связанность!
24
Уменьшить связи
Но это же и прочность!
Увеличить связи
25
Переход к рассмотрению цепочки пар связанность-прочность на различных уровнях:
Микросервисы → Контексты микросервисов → Продукты → Архитектура предприятия
26
Сформулируем новое правило:
Мера зависимостей между элементами каждого последующего уровня должна быть не выше, чем у предыдущего
Сигнал о нарушении принципов:
27
О принципах проектирования и исправлении их нарушений:
28
29
Другой вариант формулировки:
Связанность компонентов уровня должна падать с повышением абстракции уровня.
Реализация
30
Как отслеживать соблюдение принципа уменьшения связанности?
API-Gateway
31
Отличный подход для организации работы с API.
Но если рассматривать уровни компонентизации — позволяет работать максимум с двумя.
API-Gateway. �«Плоская» структура
32
2 уровня
компонентизации
3 и больше уровней?
34
Несколько каскадных API Gateway скорее добавят сложности
Everything as Code
35
+ Infrastructure as Code
+ Architecture as Code�
= Тесты!
На примере REST-связей
36
Количество зависимостей между микросервисами внутри контекста должно быть больше, чем их зависимостей от микросервисов других контекстов внутри продукта (системы), которое в свою очередь должно быть больше числа связей между разными продуктами (системами).
На примере REST-связей
37
Альтернативная формулировка.
�Только часть микросервисов контекста могут делать запросы к микросервисам из другого контекста продукта/системы. В свою очередь делать запросы к другим продуктам/системам могут ещё меньшее количество микросервисов.
Пример�
У контекста 1 внутренняя прочность — 3 у.е., внешняя связанность — 2.
У нашего проекта внутренняя прочность — 2, внешняя связанность — 1.�3 ≤ 2 ≤ 1
�У контекста 2 внутренняя прочность — 1, внешняя связанность — 0.�1 ≤ 0 ≤ 0
38
Обещанный тест
39
for (const boundary of pumlFile.boundaries) {
const cohesion =
GetBoundaryCohesion(boundary);
const coupling =
GetBoundaryCoupling(boundary);
// внутренняя прочность периметра больше внешней связанности
expect(cohesion).toBeGreaterThan(coupling);
�// если периметр содержит в себе другие периметры — его прочность меньше суммы? прочностей внутренних периметров
if (boundary.boundaries.length > 0)
expect(cohesion).toBeLessThan(<сумма прочностей внутренних контекстов>); } });
Покрытие архитектуры тестами
40
Данный пример архитектуры и реализацию простого теста на проверку правила можно посмотреть в нашем OpenSource-репозитории с инструментами для покрытия архитектуры as code тестами.
Много QR-кодов дальше, можно приготовить телефончики ☺
Тест на архитектуру —это как?
41
Статья стала статьёй года на Хабре �в номинации Бэкенд
Welcome
42
А что если правило нарушается?
43
44
Принцип каскадного снижения связанности
Открытые вопросы
46
Руслан Сафин
Бындюсофт
Спасибо за внимание!�Есть вопросы?
Куаркод на опросник по докладу.
Его подготовим по старинному рецепту и прислали мне заранее, а я вставил его на последний слайд. И прямо сейчас участники после доклада уже оценивают выступление. А потом мне придут результаты в тот же день.
Оцените доклад