Technology can solve a lot of problems, but code, libraries, and languages alone are not enough to solve all of our problems. In this chapter, we’re going to take a look at some design patterns that will prepare us for the kind of massive scale that cloud platforms facilitate.
We’ll explore the motivations behind and philosophies of Event Sourcing (ES) and Command Query Responsibility Segregation (CQRS), and then we’ll walk through some sample code that illustrates these design principles in action.
When we build software for a small scale, we tend to make a lot of assumptions. And when building microservices in a vacuum, especially if we’re following some classic “hello world"–style samples, we often do things in a way that might not be conducive to scale.
For example, our location service is synchronous. We submit a new location to it and it immediately writes that location to a database. When we want to know location history or the most recent location, we query the same service and it in turn queries the database. On the surface nothing seems all that bad about this design, until we ask ourselves how this might hold up against a million new location records per day for thousands or tens of thousands of team members. At this scale, these queries and new location submissions are going to be agonizingly slow, and we’ll quickly get bogged down waiting for the database.
This type of situation is what we call monolithic ...