Comments (5)
I don't get your point.
Events are applied after persisting and internal state is only update after that.
Replay only happens when aggregate is re-instantiated in which case they are not applied twice because whether we come from 0 or from a snapshot. There is no replay happening on a previous state that stays in-memory.
from fun-cqrs.
Please correct me if I'm wrong, but this is how I understand it:
AggregateActor
receives aCommand
- The
applyCommand
of thebehaviour
/interpreter
gets called. This executes asynchronously (future) - Upon success of the future, you have both the resulting
events
and updatedAggregateState
, which you send to yourself in aSuccessful
- You receive the
Successful
, persist the events, and update your state to that updatedAggregateState
upon a successful persist
Now you want to protect against the events being applied multiple times (not the same as protecting against the same events happening because you received the command twice). This can only happen (very unlikely though) if the Successful
you send in 3. arrives twice in 4.
What happens in your code is, you save the events first, and keep the state of that Successful
message. If this message happens 2 times, the state will indeed be correct (events only applied once). However, your events are persisted twice. If you now replay the events when "waking up" the Aggregate
, the events will be applied twice to the state.
If you want to avoid this, you have to make sure the events aren't persisted either, and have idempotent semantics in your Successful
.
from fun-cqrs.
But under which circumstances can the Successful
message arrive twice in 4?
from fun-cqrs.
This is impossible, but I understood this was what you were trying to protect against. Most likely my mistake, and misread / misunderstood. Can close. Apologies.
from fun-cqrs.
My intention was to prevent other commands to be processed while we are still persisting the events. Classical become/unbecome thing.
I'm closing this one.
from fun-cqrs.
Related Issues (20)
- Support for Scala 2.13 HOT 1
- Removal of `handleCommandAsync`, `tryToHandleCommand` and `manyEvents` methods
- timeout for applyCommand HOT 4
- Simplifying Command and Events
- AkkaBackend: Sender doesn't get any notification in case of empty list of Events
- Make the InMemoryBackend more flexible HOT 3
- Improve error message when Aggregate is not configured HOT 1
- Support for Scala 2.12
- Upgrade EventsSourceProvider to use akka.persistence.query.EventEnvelope2 in Akka 2.4 HOT 3
- Actor is not unique exception when configuring two backends in the same actor system. HOT 2
- Replace type projections by path dependent types
- Command and Event Handlers as PartialFunction HOT 1
- RxScala dependency for 2.11 HOT 7
- PersistedOffsetAkka mechanism inefficient HOT 6
- The EventsMonitorActor is hardcoded to timeout after 10 seconds
- AggregateActor "pipeTo self" bypasses termination logic of AggregateManager HOT 3
- Future of fun-cqrs HOT 5
- Multiple aggregates per actor system? HOT 4
- Would you be willing to accept a pull request for the Projection trait to have a additional method handler when event is successfully handled? HOT 2
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from fun-cqrs.