Шаблон уровня защиты от коррупции

Реализуйте слой фасада или адаптера между различными подсистемами, которые не используют одинаковую семантику. Этот уровень преобразует запросы, выполняемые одной подсистемой в другую подсистему. Используйте этот шаблон, чтобы гарантировать, что зависимости от внешних подсистем не ограничивают структуру приложения. Эрик Эванс впервые описал этот шаблон в книге Предметно-ориентированное проектирование: борьба со сложностью в основе программного обеспечения.

Контекст и проблема

Большинство приложений полагаются на другие системы для некоторых данных или функций. Например, при переносе устаревшего приложения в современную систему приложение может продолжать использовать существующие устаревшие ресурсы. Новые функции должны иметь возможность вызывать устаревшую систему. Эта возможность особенно важна для постепенной миграции, в которой с течением времени перемещаются различные функции более крупного приложения в современную систему.

Эти устаревшие системы часто имеют проблемы с качеством, такие как свертанные схемы данных или устаревшие API. Функции и технологии, используемые устаревшими системами, могут значительно отличаться от более современных систем. Чтобы взаимодействовать с устаревшей системой, новому приложению может потребоваться поддержка устаревшей инфраструктуры, протоколов, моделей данных, API или других функций, которые в противном случае не будут помещены в современное приложение.

При сохранении доступа между новыми и устаревшими системами вы принудительно принудите новую систему придерживаться по крайней мере некоторых api-интерфейсов устаревшей системы или другой семантики. Если эти устаревшие функции имеют проблемы с качеством, эта поддержка повреждает то, что в противном случае может быть чисто разработанным современным приложением.

Подобные проблемы могут возникнуть с любой внешней системой, которую ваша команда разработчиков не контролирует.

Решение

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

Схема, показывающая общий обзор паттерна «Слой защиты от коррупции».

На схеме показан центральный компонент уровня борьбы с коррупцией, который выступает в качестве границы перевода между двумя подсистемами. В левой части области в пределах точечной границы, помеченной подсистемой A, три микрослужбы подключаются через двунаправленные стрелки к трем хранилищам данных. Стрелки указывают от каждой микрослужбы в подсистеме A к уровню борьбы с коррупцией. Три стрелки ведут от антикоррупционного слоя обратно к каждому микросервису. Эти стрелки представляют двунаправленную связь между подсистемой A и уровнем борьбы с коррупцией. Справа в пределах пунктирной границы двунаправленная стрелка подключает подсистему B и хранилище данных. Стрелки направлены от подсистемы B и от хранилища данных к антикоррупционному слою. Две стрелки указывают от антикоррупционного слоя к подсистеме B и хранилищу данных. Общая структура иллюстрирует, как уровень борьбы с коррупцией медиатирует все связи между микрослужбами подсистемы А и компонентами подсистемы B путем преобразования соответствующих моделей данных и семантики без необходимости понимать внутреннюю структуру другого.

Скачайте файл Visio для этой архитектуры.

На схеме показано приложение с двумя подсистемами. Подсистема A вызывает подсистему B через уровень борьбы с коррупцией. Обмен данными между подсистемой A и уровнем борьбы с коррупцией всегда использует модель данных и архитектуру подсистемы А. Вызовы из уровня борьбы с коррупцией в подсистему B соответствуют модели данных или методам этой подсистемы. Уровень борьбы с коррупцией содержит всю логику, необходимую для перевода между двумя системами. Уровень можно реализовать как компонент в приложении или как независимую службу.

Проблемы и рекомендации

Учитывайте следующие моменты при принятии решения о том, как реализовать этот шаблон.

  • Уровень защиты от коррупции добавляет задержку для вызовов между двумя системами.

  • Уровень борьбы с коррупцией добавляет дополнительную службу, которую необходимо управлять и поддерживать.

  • Рассмотрим, как вы планируете масштабировать уровень борьбы с коррупцией.

  • Рассмотрите необходимость более одного уровня борьбы с коррупцией. Например, может потребоваться разложить функциональные возможности на несколько служб, использующих различные технологии или языки.

  • Рассмотрим, как вы планируете управлять уровнем борьбы с коррупцией в отношении других приложений или служб, а также как интегрировать его в процессы мониторинга, выпуска и конфигурации.

  • Убедитесь, что вы поддерживаете и отслеживаете согласованность транзакций и данных.

  • Рассмотрим, должен ли уровень защиты от коррупции обрабатывать все связи между различными подсистемами или просто подмножество функций.

  • Если уровень защиты от коррупции является частью стратегии миграции приложений, рассмотрите, является ли он постоянным или планируете ли вы удалить его после переноса всех устаревших функций.

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

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

  • Предусмотрите наблюдаемость, включая идентификаторы корреляции и структурированное журналирование, чтобы диагностировать сбои в процессе перевода.

Когда следует использовать этот шаблон

Используйте этот шаблон, когда:

  • Вы планируете выполнить миграцию на нескольких этапах, но необходимо поддерживать интеграцию между новыми и устаревшими системами.

  • Две или несколько подсистем имеют другую семантику, но они должны взаимодействовать.

Этот шаблон может быть не подходит, если:

  • Новые и устаревшие системы не имеют существенных семантических различий. В этом сценарии важно сосредоточить антикоррупционный слой на логике перевода. Избегайте размещать бизнес-правила или оркестрацию в слое.

Проектирование рабочей нагрузки

Оцените, как использовать шаблон «слой защиты от коррупции» при проектировании рабочей нагрузки для достижения целей и соблюдения принципов, изложенных в основных принципах платформы Azure Well-Architected Framework. В следующей таблице приведены рекомендации по использованию этого шаблона для целей каждого компонента.

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

- Инструменты и процессы OE:04
- Система мониторинга OE:07

Если этот шаблон вводит компромиссы внутри столпа, рассмотрите их против целей других столпов.

Example

Этот шаблон носит концептуальный характер и восходит к подходу разработки программного обеспечения, известному как предметно-ориентированное проектирование. Azure службы, такие как Azure API Management или Функции Azure, могут помочь в обработке и переводе протоколов, но основная цель уровня борьбы с коррупцией — защитить модель домена, а не назначать какой-либо конкретный выбор продукта.

В следующем примере управление API обрабатывает внешние проблемы воздействия и протокола. Функции Azure реализует уровень борьбы с коррупцией путем сопоставления доменов между новой системой и устаревшей системой. Azure Monitor и Application Insights предоставляют средства наблюдаемости, необходимые для отслеживания успешности и задержки перевода между двумя подсистемами.

Схема, показывающая концептуальную реализацию в Azure шаблона слоя защиты от искажения.

На схеме показан вертикальный поток, представляющий концептуальную Azure реализацию шаблона уровня борьбы с коррупцией. Сверху прямоугольник с надписью «Клиентские приложения» соединён с прямоугольником с надписью Azure API Management, в котором перечислены такие функции, как проверка подлинности, ограничение запросов и REST-фасад. Другая стрелка указывает на поле, помеченное Функции Azure, ProcessOrderFunction, которое описывает два преобразования: объект передачи данных в порядке REST (DTO) в модель домена и модель домена для устаревшей DTO. От этого блока Функции Azure вправо отходит пунктирная горизонтальная стрелка к блоку с надписью Azure Monitor и Application Insights, в котором перечислены ведение журнала, трассировка и метрики ошибок. Сплошная стрелка указывает вниз от Функции Azure к блоку с надписью «Устаревшая система заказов». На схеме показано, как клиентские приложения взаимодействуют с устаревшей системой заказов с помощью управления API и Функции Azure с мониторингом и диагностикой, предоставляемыми Azure Monitor и Application Insights. Логотип Microsoft Azure отображается в левом нижнем углу.

Помимо этой синхронной модели ответа на запрос, уровень защиты от коррупции также может использовать асинхронный, управляемый событиями подход. Используя Служебная шина Azure, Сетка событий Azure или Центры событий Azure, слой отделяет современный домен от ограничений пропускной способности устаревшей системы, чтобы разрешить перевод на основе сообщений для высокопроизводительных или высокоразвязанных рабочих нагрузок.

Дальнейшие действия