Re projection. Simplest.
This stuff should all be simple.
I’ve never needed a framework - id argue MVC more complex with all its magic binding.
On startup
Read last seen event position
Subscribe to projection from this point
On event
Read last event seen position
If seen previously -> ignore
else -> read current readmodel state + push update data somewhere (dB, socket …)
Update last event seen version
If you want to fan out projections it’s a bit more complex. That’s competing consumers, the above is simplest (I use it most of the time - but then I’m not at the crazy scale some people are at. I can wait and process faster than incoming commands so I know I can catch up). A simple way for fan out is to partition on something (store last event seen against that worker) and then fan out.
Stream name is usually aggregate-id
And so category events are often at agg root level. Model event streams and projections and walk them through. That will point to boundaries. I have used DDD terms here but most of this fall’s out naturally from modelling I find.
Re live, projections for readmodels can cover many many streams and many events. They can take a while to rebuild and have memory footprint if you don’t use persistence and snapshot.
Also the read side is usually optimised for read speed rather than consistency.
But if you really needed a consistent read model then you could replay whole stream each time and wait. But that should be slower than reading a pre unfolded event stream. But everytime I think I want this I find it is because of a non reactive UI element. Something should give and a consistent readmodel is generally not the answer.
So keep projection live. Master detail usually is in same aggregate or else you are crossing contexts in which case a domain event (some events are internal to an aggregate and some are published domain events) should exist to trigger something in another context (eg detail) which you can project from. Master detail might involve 2 or more read models if it crosses contexts.
Process managers seem to have many many options depending on needs all with trade offs in coupling and error handling. Every time I write one I’m still trying new things so dare not suggest anything.
I do as above hopefully someone can provide insight if it’s lacking!
John