Шаблон «Антикоррупционный слой»
- ·
-
Реализуйте слой фасада или адаптера между различными подсистемами, которые не разделяют одинаковую семантику. Этот слой переводит запросы, которые одна подсистема делает другой подсистеме. Используйте этот шаблон, чтобы гарантировать, что дизайн приложения не ограничивается зависимостями от внешних подсистем. Этот шаблон был описан Эриком Эвансом в Domain-Driven Design.
Контекст и проблема
Большинство приложений полагаются на другие системы для получения данных или функциональности. Например, при переносе устаревшего приложения на современную систему оно все еще может нуждаться в существующих устаревших ресурсах. Новые функции должны иметь возможность вызывать старую систему. Это особенно верно для постепенных переходов, когда различные функции большего приложения постепенно переносятся на современную систему.
Часто эти устаревшие системы страдают от проблем качества, таких как запутанные схемы данных или устаревшие API. Функции и технологии, используемые в устаревших системах, могут сильно отличаться от более современных систем. Чтобы взаимодействовать с устаревшей системой, новое приложение может потребовать поддержки устаревшей инфраструктуры, протоколов, моделей данных, API или других функций, которые обычно не используются в современном приложении.
Поддержание связи между новыми и устаревшими системами может заставить новую систему придерживаться по крайней мере некоторых API или других семантических особенностей устаревшей системы. Когда эти устаревшие функции имеют проблемы с качеством, поддержка их «искажает» то, что в противном случае могло бы быть чисто спроектированной современной системой.
Подобные проблемы могут возникать с любой внешней системой, которой ваша команда разработки не управляет, а не только с устаревшими системами.
Решение
Изолируйте различные подсистемы, разместив между ними слой антикоррупции. Этот слой переводит коммуникации между двумя системами, позволяя одной системе оставаться неизменной, в то время как другая может избежать компрометации своего дизайна и технологического подхода.
Диаграмма выше показывает приложение с двумя подсистемами. Подсистема A обращается к подсистеме B через слой антикоррупции. Связь между подсистемой A и слоем антикоррупции всегда использует модель данных и архитектуру подсистемы A. Вызовы из слоя антикоррупции в подсистему B соответствуют модели данных или методам этой подсистемы. Слой антикоррупции содержит всю логику, необходимую для перевода между двумя системами. Этот слой может быть реализован как компонент внутри приложения или как независимый сервис.
Проблемы и соображения
- Антикоррупционный слой может добавлять задержку при вызовах между двумя системами.
- Антикоррупционный слой добавляет дополнительный сервис, который должен быть управляемым и поддерживаемым.
- Рассмотрите, как ваш слой антикоррупции будет масштабироваться.
- Рассмотрите необходимость использования нескольких антикоррупционных слоев. Вы можете захотеть декомпозировать функциональность на несколько сервисов, используя разные технологии или языки программирования, или могут быть иные причины для разделения антикоррупционных слоев.
- Рассмотрите, как будет управляться слой антикоррупции в отношении других ваших приложений или служб. Как он будет интегрирован в ваши процессы мониторинга, релиза и конфигурации?
- Убедитесь, что поддерживаются и могут быть отслежены транзакции и согласованность данных.
- Рассмотрите, нужно ли, чтобы антикоррупционный слой обрабатывал всю коммуникацию между разными подсистемами или только некоторый подмножество функций.
- Если антикоррупционный слой является частью стратегии миграции приложения, то рассмотрите, будет ли он постоянным или будет удален после того, как вся легаси-функциональность будет перенесена.
- Этот шаблон иллюстрируется с помощью отдельных подсистем выше, но также может применяться к другим архитектурам сервисов, например, когда интегрируются легаси-коды в монолитную архитектуру.
Когда использовать этот шаблон
Используйте этот шаблон, когда:
- Используйте этот шаблон, когда планируется миграция в несколько этапов, но необходимо поддерживать интеграцию между новой и старой системами.
- Две или более подсистем имеют различные семантики, но все еще нуждаются в общении.
Этот шаблон может быть не подходящим, если между новой и старой системами нет значительных семантических различий.
Источник: https://learn.microsoft.com/en-us/azure/architecture/patterns/anti-corruption-layer