1 Thinking in distributed systems: Models, mindsets, and mechanics

 

This chapter covers

  • Knowing versus understanding
  • The significance of mental models
  • The structure and behavior of a distributed system
  • The correctness, scalability, and reliability of a distributed system
  • Recognizing the need for building distributed systems

Every modern application is a distributed application. Whether you are building a web app, a mobile app, or a cloud service, the question is not whether an application is distributed, but to what degree the application is distributed.

Why do we distribute applications? After all, distributed applications are notoriously hard to build, so why go through the trouble?

We assess the fitness of a system in terms of correctness, scalability, and reliability. In other words, a system must provide its intended function even in the presence of increasing load and inevitable failures. While a single component can be functional, no single component can handle unbounded load or survive inevitable failures. We need more than one component. We need a distributed system.

A distributed system is a collection of concurrent components that communicate with each other by exchanging messages over a network:

  • The behavior of a distributed system emerges from the behavior of its components and their interactions.
  • The complexity of a distributed system emerges from the complexity of its components and the intricacy of their interactions.

1.1 Software engineering and mental models

1.2 Mental models: The foundation of reasoning

1.2.1 Correct mental models

1.2.2 Complete mental models

1.2.3 Mental model of software systems

1.2.4 Different types of models

1.3 Thinking about distributed systems

1.4 Correctness

1.5 Scalability and reliability

1.6 Responsiveness

1.7 Comparison of two big ideas

1.7.1 Systems of systems

1.7.2 Global view versus local view

1.8 Distributed Systems Incorporated

1.9 A collection of AHA! Moments: Navigating the complexities of distributed systems

1.9.1 Simple yet complex

1.9.2 Emergent behavior

1.9.3 Changing perspective

1.9.4 Think globally, act locally

1.10 Thinking above the code

1.11 Summary