Chapter 10. Event sourcing: a functional approach to persistence
This chapter covers
- Thinking functionally about persisted data
- Event sourcing concepts and implementation
- Architecture of event-sourced systems
In the last chapter, you saw that in FP we avoid mutating state, especially global state. Did I mention that the database is also state, so it too should be immutable? What? Yes, didn’t you see this one coming? A database is, conceptually, just a data structure. Whether it’s stored in memory or on disk is ultimately just an implementation detail.
You saw how functional data structures, although immutable, can “evolve.” That is, you can create new “states” or new “views” of any given structure, which are built upon, but don’t alter, the original structure. This idea, which we explored with respect to objects, lists, and trees, naturally applies to in-memory data just as to stored data, and this is how our applications can represent change without mutation, even at the database level.
There are currently two approaches to this idea of append-only data storage:
- Assertion-based— Treats the DB as an ever-growing collection of facts that are true at a given point in time
- Event-based— Treats the DB as an ever-growing collection of events that occur at given points in time