I use prooph(https://github.com/prooph) so I have my write model, where I store events like below(aggregate table):

when I run projection in background using command:
php bin/console event-store:projection:run card_projection
I have read model like below:

In front of my background application I have rest API, where I create event:
CardWasAdded
through url:
POST /cards
and I receive code 201.
After that I refresh my list through url:
GET /cards
The issue is that sometimes this new event is not processed by projection.
So the question is:
How to manage that issue?
- Should I wait 2 sec or some time?(ugly hack for me).
- Should I process event after is inserted - not use projection process in background?
My answer is not prooph specific, but here are some strategies you may use in any CQRS system:
- Just accept the fact read-model is not imeediately consistent (do nothing). Example - when I post something to Twitter, i may not immediately see my post in the stream and this is ok. It will appear there eventually.
- Optimistic UI update. Just update UI as if your command went through. If not - not a big deal. Example - Like something on Twitter. You don't need to wait for confirmation. If somehow like failed - its status will come with next read model refresh.
- Wait at the API endpoint. Your API was called, you issue a command, and look for particular read model update to happen. Fail on timeout.
- Wait at UI level. You send a command and display some "Waiting" UI element until your query returns what you are looking for, or fail on timeout.
With strategy 3 and 4 you may use some kind of server signaling - sockets or something like this. Your read model might be able to confirm it was updated.