Chapter 1. Why Reactive?

We start from the desire to build a system that is responsive to users. This means the system should respond to user input in a timely fashion under all circumstances. Because any single computer can fail at any time, we need to distribute such a system over multiple computers. Adding this fundamental requirement for distribution makes us recognize the need for new architecture patterns (or to rediscover old ones). In the past, we developed methods that allowed us to retain the illusion of single-threaded local processing while having it magically executed on multiple cores or network nodes, but the gap between that illusion and reality is becoming prohibitively large.[1] The solution is to make the distributed, concurrent nature of our applications explicit in the programming model, using it to our advantage.

1For example, Java EE services allow us to transparently call remote services that are wired in automatically, possibly even including distributed database transactions. The possibility of network failure or remote service overload, and so on, is completely hidden, abstracted away, and consequently out of reach for developers to meaningfully take into account.

1.1. The anatomy of a Reactive application

1.2. Coping with load

1.3. Coping with failures

1.4. Making the system responsive

1.5. Avoiding the ball of mud

1.6. Integrating nonreactive components

1.7. Summary