01 / Reading Guide
Reading Guide
Citation
Cachin, C., Guerraoui, R., & Rodrigues, L. (2011). Introduction to Reliable and Secure Distributed Programming (2nd ed.). Springer.
Chapter Summary
The book (about 320 pages) is a textbook on distributed programming abstractions and the algorithms that implement them when processes can crash or be attacked. Its central theme, in the preface, is tolerance to uncertainty and adversarial influence: network delays, faults and malicious attacks. The authors go from simple abstractions in simple environments to more sophisticated abstractions in more challenging ones, and they often implement the same primitive under several system models in order to show how the model changes the algorithm. The book is in two parts: Part I (Chapters 1–2) establishes common ground, and Part II (Chapters 3–6) takes one problem per chapter. Chapter 7 is a short closing chapter. The second edition adds security against malicious behaviour (Byzantine fault tolerance) to the first edition, Introduction to Reliable Distributed Programming (2006), which is why the title gained the word "secure" and a co-author.
Chapter 1: Introduction
The chapter motivates distributed programming abstractions by discussing applications that use them. It covers distributed programming abstractions, the end-to-end argument, software components, and classes of algorithms, and it introduces the modular notation and pseudo code that describe the algorithms throughout the book.
Chapter 2: Basic Abstractions
This chapter presents the assumptions about the distributed environment and a family of system models, and the preface suggests treating it as a reference for the later chapters. Topics are distributed computation, abstracting processes, cryptographic abstractions, abstracting communication, timing assumptions, abstracting time and the resulting distributed-system models. It ends with exercises and solutions.
Chapter 3: Reliable Broadcast
Broadcasting a message to a group with varying delivery guarantees. The chapter moves from best-effort broadcast through regular and uniform reliable broadcast to stubborn and logged variants, probabilistic broadcast, FIFO and causal broadcast, and, for malicious faults, Byzantine consistent broadcast, Byzantine reliable broadcast and Byzantine broadcast channels. The preface's example is making sure a message delivered to one process is delivered to all, even if the sender crashes.
Chapter 4: Shared Memory
Shared memory models distributed storage objects accessed by read and write operations, such as files in a distributed storage system or registers in a multiprocessor. The chapter builds (1, N) regular and atomic registers and (N, N) atomic registers, a logged regular register, and Byzantine safe, regular and atomic registers, so that a value can be retrieved even when some processes crash, lose the value or report wrong data.
Chapter 5: Consensus
The consensus abstraction lets processes decide on a common value from proposed values despite faulty processes. The chapter covers regular consensus, uniform consensus (including in the fail-noisy model), logged consensus, randomized consensus, Byzantine consensus and Byzantine randomized consensus.
Chapter 6: Consensus Variants
Variants obtained by extending or modifying consensus: total-order broadcast (and a Byzantine version), terminating reliable broadcast, fast consensus and fast Byzantine consensus, nonblocking atomic commit, group membership and view-synchronous communication.
Chapter 7: Concluding Remarks
A short closing chapter on implementation in Appia, further implementations, and further reading.
Key Concepts
Chapters 1–2: Abstractions and Models
- Module and event notation: the modular pseudo-code style used to specify abstractions and algorithms.
- System model: the process abstraction (crash and Byzantine faults), the link abstraction and timing assumptions.
- Cryptographic abstractions: abstract versions of the cryptographic primitives that the Byzantine algorithms rely on.
Chapters 3–4: Broadcast and Registers
- Reliable and uniform broadcast: delivery guarantees despite crashes, with the stronger uniform version.
- FIFO and causal broadcast: ordering guarantees layered on reliable broadcast.
- Regular and atomic registers: precise correctness conditions for shared storage.
Chapters 5–6: Consensus
- Consensus: agreement on a proposed value in the presence of faulty processes.
- Total-order broadcast, atomic commit, group membership: abstractions defined through consensus.
- Byzantine variants: counterparts that tolerate arbitrary or malicious behaviour.
Critical Analysis
Strengths
- Modular, incremental design. Specifications of abstractions come first, algorithms follow in the simplest model, and the same primitive is revisited in harder models, so the effect of assumptions is visible.
- Both crash and Byzantine faults. The second edition extends the first with security against malicious processes, and each of Chapters 3 to 6 includes Byzantine variants alongside the crash-fault ones.
- Exercises with solutions. The authors spent considerable time on exercises and include solutions to all of them, intending them to be part of the content. Easy ones suit a class; harder ones suit individual study.
- Self-contained. The preface says the book is self-contained and that the abstractions can be understood with minimal background in algorithms, logic, networking, security and operating systems.
- Supporting material. The book's website provides slides, tutorial material and the first edition's hands-on Java implementations in the Appia framework, updated for this edition.
Limitations
- Not formal proofs. The authors state that there is no theorem in the book and that correctness arguments aim at understanding rather than formal proof; the focus is abstractions and algorithms, not computability and complexity. Readers who want impossibility results or complexity bounds will need another source.
- Formal rather than practical. A reviewer of the second edition (Alex Popescu) calls it a superb introduction from a formal perspective that is about distributed-system fundamentals such as consensus, registers and broadcast, not "programming" or "engineering".
- Scope. A reviewer of the first edition (Seif Haridi) noted topics not covered, such as self-stabilizing algorithms and a more detailed account of distributed transactions.
- Pace for a course. Another first-edition reviewer (Felix Freiling) reported that going through the low-level abstractions up to terminating reliable broadcast already took a full semester, even without the programming exercises and with additional material on proofs.
Where It Fits in the Course
This is the formal, algorithmic end of the distributed-systems list. Understanding Distributed Systems is a concise introduction for developers who build or operate networked applications; Distributed Systems by van Steen and Tanenbaum and Distributed Systems: Concepts and Design by Coulouris and colleagues are broad textbooks covering architectures, communication, naming, replication and security; Designing Data-Intensive Applications is a practical study of data systems; and An Introduction to Parallel Programming is about writing parallel programs for multicore, cluster and GPU systems.
Read the broader textbooks or the practical books first to see the systems; read this book when you want precise specifications and algorithms for broadcast, registers and consensus, and an understanding of why replicated systems behave as they do under failure and attack.
How to Use This Book
The authors wrote it as a textbook for undergraduate or basic graduate teaching and for individual study. Elementary knowledge of algorithms, first-order logic, programming languages, networking, security and operating systems is helpful but not required.
A practical plan:
- Shorter, elementary course: Chapters 1–2, then the crash-failure versions of Chapters 3 to 6, which the preface describes as a shorter course and a companion to a practice-oriented distributed-programming course.
- Full course: all chapters and exercises, including the Byzantine and randomized algorithms.
- By interest: Chapter 3 for replication and messaging, Chapter 4 for storage, Chapter 5 for agreement.
Do the exercises before checking the solutions; the authors say that no reasonable understanding can be achieved passively. The Appia hands-on code from the website is a way to run the algorithms.
