phpcqrsevent-sourcingprooph

Waiting for new record in read model created by projection in PROOPH


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

Write model

when I run projection in background using command:

php bin/console event-store:projection:run card_projection

I have read model like below:

Read model

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?

  1. Should I wait 2 sec or some time?(ugly hack for me).
  2. Should I process event after is inserted - not use projection process in background?

Solution

  • My answer is not prooph specific, but here are some strategies you may use in any CQRS system:

    1. 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.
    2. 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.
    3. 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.
    4. 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.