Много написано, возможно я как-то неправильно интерптерирую контекст.
Если я правильно понял, мы решаем задачу сихнронизации данных между BC и/или между двумя микросервисами в рамках одного BC, с сохранением атономности микросервисов и их баз прежде всего. Эту задачу можно решить несколькокими способами, вот два из них:
1) При событийно-ориентированной архитектуре "зависимый" микросервис, причём не важно, в одном BC или нет, слушает изменения и обновляет у себя некое внутреннее представление. При этом, микросервисы должны публиковать все изменения, что не проблема при наличии современных pub/sub продуктов. На самом деле мы и так публикуем все изменения, они потом пишутся в лог Hadoop, например, индексируются Эластиком и т.д.
2) Использовать CQRS - то есть микросервисы выставляют адаптированные для чтения представления (read model), которые могут читать другие микросервисы напрямую. Но нужно понимать, что при этом структура этих представлений и параметры подключения к ним становятся частью контракта. В случае EventSourcing выставлюятся не представления, а проекции.
@emacsway поправь пожалуйста если я заблуждаюсь.
При этом, в обоих случаях агрегация выполняется в зависимом микросервисе "заказы".
Bff предназначен для формирования "внешнего" API под конкретный клиент (фронт/мобайл), при этом Bff выполняет агрегацию "внутренних" API. Bff должен минимум логики содержать и делать только минимум из того, что нужно для "внешнего" API на основе вызовов "внутренних" API. По сути это вариант паттерна Facade. Иначе логика переедет в Bff, то есть всё что мы не сделали в микросервисе "заказы", переедет с большой вероятностью в Bff. Отличный вариант!:)
Почему так. Тут все "пляски" вокруг автономности БД микросервисов. Зачем нужна автономность? Чтобы кто-то с наружи не уронил запросами БД (модель изменения в терминах CQRS) и чтобы микросервис мог произвольно изменять структуру своей БД (своих таблиц при Monolith First). Оба варианта решают задачу автономности модели изменений, а модели чтения итак адаптированы под запросы извне и должны хорошо масштабироваться на чтение.
При этом 1-й вариант лучше, потому что он обеспечивает полную автономность, не нужно заботиться о соблюдении контракта представлений (структур вьюх) и их масштабировании. Единственный недостаток 1-го варианта, больше данных ходят по очередям.
Сложность запросов во 2-м случае невозможно контролировать. Как решение, представления на чтения в инмемори базах/кэше которые просто нельзя нагрузить "олапными" запросами, потому что они не умеют полноценный SQL. А в идеале - отдают данные только по ключу.
И мы конечно понимаем, что в любом случае речь о согласованности в конечном итоге.