Ответ на этот вопрос разбивается на две отдельные области:
- логическая задача взаимодействия между различными контекстами, где одни и те же данные могут использоваться совершенно по-разному,Как один контекст интерпретирует значение данных?
- и техническую задачу синхронизации данных между независимыми системами.Как мы можем гарантировать правильность поведения каждой системы, когда обе они имеют независимые копии «одинаковых» данных?
Логически карта контекста используется для определения взаимосвязи между любыми ограниченными контекстами, которые необходимообщаться (обмениваться данными) любым способом.Модели предметной области, управляющие данными, применимы только в одном ограниченном контексте, поэтому необходим некоторый метод для интерпретации данных из другого контекста.Вот где в игру вступают паттерны из книги Эвана: клиент / поставщик, конформист, публикуемый язык, открытый хост, антикоррупционный уровень или (паттерн отговорки) отдельные пути.
Использование посредника междуОднако службы могут быть реализацией шаблона уровня защиты от коррупции : службам не нужно для того, чтобы они говорили на одном языке, потому что между ними есть независимый буфер, выполняющий перевод,В микросервисной архитектуре это может быть своего рода сервис интеграции между двумя очень разными контекстами.
С технической точки зрения прямые вызовы API между сервисами в разных ограниченных контекстах вводят зависимости между этими сервисами, поэтому управляемые событиямиПодход, подобный тому, о котором упоминал Аллан, предпочтителен, если предположить, что с вашим приложением все в порядке (возможная согласованность данных).Выбор платформы обмена сообщениями, которая дает вам гарантии, необходимые для синхронизации данных, очень важен.Большинство протоколов асинхронного обмена сообщениями гарантируют доставку «хотя бы один раз», но упорядочение сообщений и дедупликация повторений зависит от приложения.
Иногда проще использовать синхронный вызов API, особенно если вы делаете этобольшое количество сообщений типа запрос / ответ (что может случиться, если у вас есть службы, отправляющие друг другу сообщения типа команды).
Составной пользовательский интерфейс - это еще один шаблон, который позволяет выполнять интеграцию данных на уровне представления,заставляя каждый компонент извлекать данные из соответствующей службы, а затем делиться / объединять данные в самом пользовательском интерфейсе.Это может быть проще в управлении, чем запутанная сеть межсервисных API-вызовов в бэкэнде, особенно если вы используете что-то вроде службы IT / Ops, NGINX или MuleSoft's Experience API, чтобы реализовать «бэкэнд для внешнего интерфейса».