In our project, the domain folks demand our system to be fully consistent, fearing occasional inconsistencies between read (query) model and write model caused by eventual consistency. At the same time, we need all domain objects (aggregates) to have historical data (e.g. to be able to rebuild a historical version or analyze historical changes). Thus, Event Sourcing and CQRS seem to fit quite well except for the otherwise preferred asynchronous dispatching and processing of events. Due to the full consistency requirement we want to process the command, change the state of the aggregate object and update the query model within the same transaction. We also use Spring (Boot etc.) already.
After going through the Axon docs and forums, I have not found any way how to update the query model synchronously and still keep the events in an event store. I could have a Spring @Transactional transaction encompassing the command processing and updating the query model via an event sent through the SimpleEventBus, which is synchronous. But the SimpleEventBus does not provide for an Event Store. Only the EmbeddedEventStore persists events in an Event Store, but it is asynchronous. By associating a Transaction Manager I could make the dispatching of events (e.g. in RabbitMQ) synchronous and thus part of my big transaction, but the processing of the event would still happen outside the transaction and therefore the query model would not become fully consistent.
Should we use SimpleEventBus and implement our own Event Store? Are there other options?