Staff Software Engineer. Passionate about DDD, CQRS, Event Sourcing and Distributed Systems.
Kayaking, too.
Streaming: "Process this message and move on"
Sourcing: "Store this event forever, rebuild state from it"
Kafka with infinite retention + replay = event store.
Kafka with 7-day retention + fire-and-forget = streaming.
Same tech. Different pattern.
Know which one you're building.
Streaming: "Process this message and move on"
Sourcing: "Store this event forever, rebuild state from it"
Kafka with infinite retention + replay = event store.
Kafka with 7-day retention + fire-and-forget = streaming.
Same tech. Different pattern.
Know which one you're building.
Event Sourcing: Events flowing down the river, but they're collected at the riverbank. Stored permanently.
Same river. Different approach.
Event Sourcing: Events flowing down the river, but they're collected at the riverbank. Stored permanently.
Same river. Different approach.
Lovely demo. Loved /lab too 💪
Lovely demo. Loved /lab too 💪
Orchestration is how you'd model a Workflow. That can trigger commands and listen to events, wait for more events, invoke more commands until the Workflow is complete.
Orchestration is how you'd model a Workflow. That can trigger commands and listen to events, wait for more events, invoke more commands until the Workflow is complete.
Imagine you had a counter which couldn't exceed 100. You wouldn't add an event to it's stream saying `CountIncremented`. Rules need to be protected.
You'd call something to invoke an `IncrementCount` command.
Imagine you had a counter which couldn't exceed 100. You wouldn't add an event to it's stream saying `CountIncremented`. Rules need to be protected.
You'd call something to invoke an `IncrementCount` command.
A request maps to a command which, if successful, would result in a new event added to the stream.
A request maps to a command which, if successful, would result in a new event added to the stream.
Excellent excuse for another coffee... ☕️
Thanks for sharing!
Excellent excuse for another coffee... ☕️
Thanks for sharing!
I think the options are storing a checkpoint, restarting from a snapshot, or replaying from the beginning. Projections are ephemeral, though. We should feel comfortable throwing them away and rebuilding them.
I think the options are storing a checkpoint, restarting from a snapshot, or replaying from the beginning. Projections are ephemeral, though. We should feel comfortable throwing them away and rebuilding them.
youtu.be/eD7ls4KynRo
youtu.be/eD7ls4KynRo
I have a local app which displays me some metrics which is aggregate-less. But the complexity is low. I don't know how I'd handle enforcing a constraint, without duplicating it's source of truth, required by multiple commands.
wdyd?
I have a local app which displays me some metrics which is aggregate-less. But the complexity is low. I don't know how I'd handle enforcing a constraint, without duplicating it's source of truth, required by multiple commands.
wdyd?
Thus your workflow is its own log.
Thus your workflow is its own log.
- Trace an entire business flow across services
- Subscribe to "everything about order ABC123"
- Debug distributed systems without questioning your life choices
It is a massive debuggability improvement.
- Trace an entire business flow across services
- Subscribe to "everything about order ABC123"
- Debug distributed systems without questioning your life choices
It is a massive debuggability improvement.