A Sample Event Sourcing Demo with Sekiban.Pure
This repository provides a very simple demonstration of event sourcing.
Event sourcing is a simple concept: save events, and project the current state using a projector.
Included here are a lightweight event sourcing library and a sample domain, making it a great starting point for understanding how event sourcing frameworks can be built.
It also comes with a minimal Web API (with a scalar UI), a simple console application, and straightforward unit tests.
Events are stored in a simple List<IEvent>
—this is purely in-memory and not meant as a production-ready persistence layer. Additionally, we only have projection at the partition level, so you cannot create live projections that list all aggregates.
- Domain: A simple event sourcing framework and sample domain.
- Web: A basic Web API.
- Console: A simple console application.
- Test: Basic xUnit tests.
Note: Querying and listing existing aggregates is not currently implemented.
- Aggregate: Represents the state container, which changes throughout its lifecycle.
- Command: Triggers changes to an Aggregate. Commands are processed by a command handler and affect only a single partition.
- Command Handler: A function that produces events in response to a command.
- Event: A fact that is stored as the source of truth.
- Partition: A stream of events. Aggregates can be reconstructed (projected) from these events.
- Projector: A function that applies events to evolve the aggregate’s state, returning a new state.
C# is the language we first developed Sekiban. This is updated concept of new Sekiban. It is still very simple yet powerful enough to extend in future Sekiban.
https://github.com/J-Tech-Japan/SuperSimpleEventSourcing/tree/main/csharp
With my limited knowledge and help of LLM, I have completed very very simple Rust implementation. In console you can see it can send command and change aggregate. Change Suggestion welcomed!
https://github.com/J-Tech-Japan/SuperSimpleEventSourcing/tree/main/rust
With my limited knowledge and help of LLM, I have completed very very simple Go implementation as well. In console you can see it can send command and change aggregate. Change Suggestion welcomed!
https://github.com/J-Tech-Japan/SuperSimpleEventSourcing/tree/main/go
I use typescript for Frontend but not often. It was first time to write as backend component, first concept is made for the console application. Change Suggestion would be welcomed!
https://github.com/J-Tech-Japan/SuperSimpleEventSourcing/tree/main/typescript
- F#
maybe.
We are extending these concepts in the Sekiban project:
https://github.com/J-Tech-Japan/Sekiban
We are continually improving domain modeling approaches. While the concepts here are still under development, Sekiban already supports Azure Cosmos DB, DynamoDB, and PostgreSQL. It offers a full-featured environment for building event-sourced applications for small to medium projects, and we are working towards better support in distributed environments.