Я понимаю разницу между транзакционной последовательностью и возможной последовательностью.Скажем, я разрабатываю приложение, в котором есть три микросервиса и существует шина сообщений, которая отправляет сообщения между ними при возникновении событий интеграции, что означает конечную согласованность.Например, Microservice B публикует событие интеграции, а Microservice A обрабатывает его два часа спустя, потому что Microservice B был недоступен во время публикации события, и сообщение является надежным - это нормально.
Как я понимаю;внутри микросервиса должна быть согласованность транзакций - Агрегат A может публиковать событие домена, в котором заинтересован Агрегат B, поэтому возникает Событие домена, и любые обновления базы данных выполняются в рамках одной транзакции.
Я не делаюпонять, как CQRS вписывается в этот сценарий согласованности транзакций / возможной согласованности, потому что:
- Я не могу использовать согласованность транзакций, поскольку модель чтения (NoSQL) и модель записи (сервер SQL) не могут быть обновлены внутри одной транзакции.
- Я не могу использовать шину сообщений, потому что обновление модели чтения не является событием интеграции, т. Е. Модель чтения и модель записи содержатся внутри одного и того же микросервиса.
В CQRS я полагаю, чтоЕсть два варианта:
- Если использовать хранилище событий для стороны записи, то сторона чтения может опрашивать ее - это решает проблему, потому что нет события.
- При использовании журнала событий / реляционной базы данных для стороны записи генерируется событие домена для обновления стороны чтения.
Если выбран второй вариант, то как я могу гарантироватьчто модель чтения будет синхронизирована с моделью записи в конце концов?Например, модель чтения может быть недоступна при возникновении события.