Blokh
Event sourcing in Elixir - Without CQRS
Greetings,
I’ve been looking around for a good Event-Sourcing sample project in Elixir but all I could find is the great job of Ben Smin (@slashdotdash).
Which is really great but I do not believe in CQRS complexity for a simple project.
Does anyone have any suggestions where I could study more about Event sourcing in elixir without slicing apart my read and write interfaces?
Thanks in advance,
Blokh
Marked As Solved
slashdotdash
You can use Commanded for event sourcing without requiring CQRS. Commanded focuses on the write model, but provides the Ecto projections library as one way of projecting events into a SQL database. There’s an undocumented function to access aggregate state (Commanded.Aggregates.Aggregate.aggregate_state/3) which would allow you to use Commanded with a single model for writing and to later query the state of the aggregate.
The reason why this isn’t the preferred approach (IMO) is because although the query model initially closely resembles the write model, soon they will start to differ in structure or access pattern (e.g. reporting, aggregating data and multi-entity views). Hence why I opt to go with separating reads from writes from the outset (CQRS) when using event sourcing.
Also Liked
LostKobrakai
It’s not really ready yet (a few upcoming changes in the pipeline), but https://github.com/CargoSense/fable is a great intermediate between not doing es and going all in with commanded.
kokolegorille
You might like
I am not sure it is a requirement to have multiple database, isn’t it just a separation of concern between read and write?!
peerreynders
- Every software developer who has used version control has interacted with an Event Sourcing system.
- If you need to explain Event Sourcing to the business, use accounting ledgers.
benwilson512
Event sourcing is more than just writing to a table called events. The “sourcing” bit of event sourcing means that you are driving state exclusively off of the event log. Your example here simply writes an event alongside the normal table insert, it doesn’t drive the table insert off of the event. To do this properly you also need order guarantees: that each event is processed in order to other events.
bottlenecked
Hi there, the problem that cqrs tries to solve is that because of the way data is written in the event store it’s very difficult and/or inefficient to do aggregate queries against that data.
For example lets say your domain is banking accounts, and each event represents a transaction in some customer’s account. Without a separate read model optimized for queries it would be really difficult to get stats like “give the top ten accounts that have made a deposit over x amount last month”
So unless you never read that data outside your main application (eg no admin screens presenting aggregate info over your data), you’re probably going to need a separate read model- and that means buying fully into es+cqrs







