Real-World Event Sourcing
Distribute, Evolve, and Scale Your Elixir Applications
by Kevin Hoffman
Reality is event-sourced; your mind processes sight, sound, taste,
smell, and touch to create its perception of reality. Software isn’t
that different. Applications use streams of incoming data to create
their own realities, and when you interpret that data as events
containing state and context, even some of the most complex problems
become easily solvable. Unravel the theory behind event sourcing and
discover how to put this approach into practice with practical, hands-on
coding examples. From early-stage development through production and
release, you’ll unlock powerful new ways of clearing even the toughest
programming hurdles.
Our applications are bombarded with data. It’s hard enough to derive
state from that data, let alone discover how we arrived at that state.
With event sourcing you can treat the stream of data as a simple
sequence of events that you use to construct whatever state you need.
Event sourcing is more than events; it adds patterns, rules, and
constraints to produce robust and easy-to-maintain systems. In this
book, you’ll learn which rules can never be broken and which ones are
flexible. By grounding yourself in theory, rules, and practical
approaches, you’ll be able to build real-world, event-sourced
applications.
Get your hands dirty with fundamental event-sourcing building blocks
such as commands, aggregates, projectors, process managers, injectors,
and notifiers. Combine these building blocks to produce elegant
solutions to complex problems. Leave “hello world” far behind as you
tackle the more advanced aspects of event sourcing that give you the
confidence you need to run these applications in production. Leverage
event sourcing to create distributed applications with ease; model and
handle failure; and deal with replays, schema evolution, security, and
much more.
This book doesn’t shy away from confronting the hard parts of event
sourcing, instead giving you clear advice and examples for tackling the
most difficult details.
Empower your applications with the full force of event sourcing today.
What You Need
You’ll need a computer preferably running MacOS, Linux, or WSL/Ubuntu on
Windows. You’ll install everything else you need (such as Elixir and an
event store) as you progress through the book.
Resources
Releases:
2025/03/31
P1.0
First printing.
2025/01/24
B4.0
Copy edit and indexing are complete. Now it’s on to layout and the printer.
2024/11/12
B3.0
*The book is content-complete and headed to copy edit and indexing.
2024/09/16
B2.0
*Updates to the Preface’s explanation of how asides are presented throughout the book.
*Updates to the presentation of asides throughout the book.
*Minor updates to the text to fix typos.
- Preface
- Who Should Read This Book?
- About This Book
- How to Read This Book
- Conventions Used in This Book
- Online Resources
- Let’s Get Started!
- Building Your First Event-Sourced Application
- Saying “Hello, Procedural World”
- Building a Stateful and Imperative Calculator
- Creating Your First Event-Driven Calculator
- Handling Errors by Modeling
Failure

- Working with Event Sourcing Aggregates
- Wrapping Up
- Separating Read and Write Models
- Enforcing Perimeters with Injectors and Notifiers
- Handling Input and Output in an Event-Sourced World
- Reacting to Injected Events
- Notifying External Consumers
- Introducing Cloud Events
- Building a Flight Tracker with Injection and Notification
- Wrapping Up
- Exploring the Saga of the Process Manager
- Building Event-Sourced Elixir Apps with Commanded
- Deciding Where to Start
- Introducing Lunar Frontiers
- Creating the First Flow
- Playing the Game
- Wrapping Up
- Building Resilient Applications withEvent Stores
- Evaluating Event and Projection Stores
- Replaying Events
- Capacity Planning
- Exploring Event Store
- Upgrading Lunar Frontiers
- Adding Durable Projections to Lunar Frontiers
- Wrapping Up
- Evolving Event-Sourced Systems
- Evolving Event Schemas
- Evolving Aggregates
- Evolving Projections and Projectors
- Evolving Process Managers
- Evolving Lunar Frontiers
- Migrating Event Streams
- Wrapping Up
- Securing Event-Sourced Applications
- Securing Event Streams
- Securing Command Paths
- Securing Projections and Component State
- Supporting GDPR and the Right to Be Forgotten
- Wrapping Up
- Testing Event-Sourced Systems
- Testing Aggregates
- Testing Projectors
- Testing Process Managers
- Using Automated and Acceptance Testing
- Wrapping Up
- Modeling Discoverable Application Domains
- Defining and Documenting Schemas
- Modeling Event Flows
- Modeling Case Study: Crafter Hustle
- Wrapping Up
- Scaling Up and Out
- Reading Your Writes
- Preparing for Disorder
- Preventing Duplicate Processing
- Event Sourcing at Scale with NATS
- The Laws of Event Sourcing
- All Events Are Immutable and Past Tense
- Applying a Failure Event Must Always Return the Previous State
- All Data Required for a Projection Must Be on the Events
- Work Is a Side Effect
- All Projections Must Stem from Events
- Never Manage More than One Flow per Process Manager
- Process Managers Must Not Read from Projections
- Event Schemas Are Immutable
- Different Projectors Cannot Share Projections
- Never Test Internal State
Author
Kevin Hoffman is the Engineering Director for Cloud Services at
Synadia, the company behind NATS, a popular messaging and streaming
server. Kevin specializes in distributed applications and has made
enough event sourcing mistakes on his own to fill a book with what he’s
learned and experienced.