У меня вопрос по следующей ситуации. Допустим, у нас есть 2 домена с 2 агрегатами. Домен A и домен B — это разные микросервисы.
- Домен A – совокупность продуктов
- Домен B - совокупность магазинов
В нашем дизайне мы решаем, что домен A ничего не знает о домене B. В домене B каждый агрегат магазина имеет ссылку на один или несколько продуктов (товаров, которые можно продать).
Если мы хотим удалить продукт, мы можем отправить команду RemoveProductCommand в домен A — совокупность продуктов.
Как справиться с обновлением магазина, где предметы должны быть удалены из списка продаваемых предметов? Мы хотим сделать это своего рода "транзакционным" почему (отметить как удаленное только в том случае, если оно также удалено из всех магазинов).
Я уже думал об этом и вижу 4 возможных варианта:
Прослушивайте агрегаты магазина для ProductRemovedEvent, а затем удаляйте ссылку на продукт из магазина. Смиритесь с тем, что эта теория может привести к ситуации, когда продукт нельзя будет удалить, и он все еще будет в списке продаж магазина.
Создайте SAGA в домене A и сначала удалите товары из магазинов, прежде чем пометить продукт как удаленный. Если обработка Saga не удалась, то все статусы магазина должны быть восстановлены путем отправки некоторых команд восстановления уже измененным агрегатам магазина. Чтобы узнать, какой магазин ссылается на продукт, мы используем запрос запроса для получения этой информации.
То же, что и маркер 2, но также хранит информацию о магазине (идентификаторы) в совокупности продуктов (productListedInShopList).
Другие определения домена/агрегата (например, объединить их)
Любые предложения, как лучше всего решить эту проблему?