KEMBAR78
Event Sourcing & CQRS using the Critter Stack | PPTX
CQRS and
Event
Sourcing
with the
“Critter Stack”
August 14th, 2024
Goals of this
Workshop
• Introduction to Event Sourcing
• What goes into building a robust
Event Driven Architecture
• Convincing you all to use the
“Critter Stack!”
• Make you love the idea of low
ceremony code
Environmental
Requirements
• Install .NET 8 SDK
• Install Docker Desktop
• Clone https://github.com/Jjasperfx/EventDrivenArchitectureWorkshop
• From the command line, run “docker compose up –d”
Building a Critter Stack Application Series
About Me
• Owner and Founder of JasperFx Software LLC
• Marten Core Team & Wolverine Project Leader
• Longtime OSS Author (StructureMap et al)
• https://jeremydmiller.com
The “Critter
Stack”
• Marten, Wolverine, Weasel
(“Mustelidae”)
• Toolset for Event Driven Architecture
• Low ceremony coding model
• High testability & low friction
integration testing
• Low friction developer experience
• Robust system development
Weasel
• OSS Library for Low Level Database Utilities
• Supporting Actor
• Command Batching
• SQL Generation
• Schema Migrations
• Makes ADO.Net less aggravating
Marten
• Open Source .NET Library
• Uses PostgreSQL for Persistence
• ACID Compliant Document Store
• Integrated Event Sourcing
Marten as Document
Database
Why a Document
Database?
• Because you can develop faster, full stop
• Handles deep nested structures
• Great story for polymorphic entities
• Advantageous when entities are self-contained
Event Sourcing
A style of persistence where the single
source of truth, system state is a read
only, append only sequence of all the
events that resulted in a change in the
system state.
Advantages to
Event Sourcing
• Usage of Business Language
• Audit Log
• Temporal Querying / “Time
Travel”
• Retrofitting Metrics
• Complement to CQRS
• Concurrency
Help Desk
API
Event Storming – Help Desk Service
Marten
Event
Sourcing
Quickstart
Marten
Terminology
• Event - a persisted business event representing a change in state or record of an action taken in
the system
• Stream - a related "stream" of events representing a single business workflow or concept
• Projection - any strategy for generating a “read side” view of the system state from the events
• Aggregate – in Marten terms, a flavor of projection that combines a related set of events into a
single view
Marten
Projections
Our first ”Incident” Projection
”Read Side” Web
Service
Projection
Considerations
• Inline – simple approach, strong consistency, slower ”writes”,
faster “reads”
• Live – simple approach, strong consistency, faster “writes”,
slower “reads”
• Async – more complicated, eventual consistency, fast “writes”,
fast “reads”
Time Travel
Fast Web
Services
CQRS
•Command Query Responsibility
Segregation
•A software architectural pattern
where “reads” and “writes” are
strictly segregated within the
system
Building Command
Handlers
• Validate command inputs
• Fetch existing “write” model state
• Determine what new events to append
• Managing transactions
• Concurrency
• Error handling and resiliency
• Publishing events
• Observability
Automated Integration Testing
•Known inputs, expected outcomes
•Marten has built in test helpers for
controlling system state in tests
•“Self-Contained Tests”
Guest starring…
Alba
Easy Integration testing for
ASP.NET Core
https://jasperfx.github.io/alba/
Oakton
Parsing and Utilities for
Command Line Tools in .Net
https://jasperfx.github.io/oakton
Building a Test Harness
Command Line Tools
Wolverine
• Open Source .NET
Framework
• Command Executor
• Local Queueing
• Asynchronous Messaging
• Alternative HTTP Service
Framework
• Strong Integration with
Marten
Background work with
Wolverine
Wolverine as Mediator
Aggregate Handler Workflow
Drink the Koolaid
and use Wolverine
for HTTP
Fluent Validation Middleware
Unwinding
the Magic
Subscribing to Events
Transactional Outbox
Integration Testing for
Wolverine Message Handling
Vertical Slice Architecture the
Wolverine Way
Asynchronous Messaging with
Wolverine and Rabbit MQ
The “Stateful Resource” Model
Error Handling and Resiliency
Retries
Dead Letter Queues
Message Timeouts
Circuit Breakers
Critical Errors
Designing for Concurrency
Open Telemetry and Metrics
Multi-
Tenancy
• Marten Storage
• Conjoined Multi Tenancy
• Separate Database per
Tenant
• Wolverine Tenant Id
Propagation
• Wolverine Tenant Id
Detection
Resources
• JasperFx Software –
https://jasperfx.net
• Marten – https://martendb.io
• Wolverine –
https://wolverine.netlify.app

Event Sourcing & CQRS using the Critter Stack