Preface |
|
xi | |
|
|
|
1 Introduction to Scalable Systems |
|
|
3 | (16) |
|
|
3 | (3) |
|
Examples of System Scale in the Early 2000s |
|
|
6 | (1) |
|
How Did We Get Here? A Brief History of System Growth |
|
|
7 | (2) |
|
Scalability Basic Design Principles |
|
|
9 | (2) |
|
|
11 | (2) |
|
Scalability and Architecture Trade-Offs |
|
|
13 | (4) |
|
|
13 | (1) |
|
|
14 | (1) |
|
|
15 | (1) |
|
|
16 | (1) |
|
Summary and Further Reading |
|
|
17 | (2) |
|
2 Distributed Systems Architectures: An Introduction |
|
|
19 | (16) |
|
Basic System Architecture |
|
|
19 | (2) |
|
|
21 | (2) |
|
Scaling the Database with Caching |
|
|
23 | (2) |
|
Distributing the Database |
|
|
25 | (2) |
|
Multiple Processing Tiers |
|
|
27 | (3) |
|
Increasing Responsiveness |
|
|
30 | (2) |
|
Systems and Hardware Scalability |
|
|
32 | (2) |
|
Summary and Further Reading |
|
|
34 | (1) |
|
3 Distributed Systems Essentials |
|
|
35 | (26) |
|
|
35 | (8) |
|
|
36 | (3) |
|
|
39 | (4) |
|
|
43 | (6) |
|
|
49 | (4) |
|
Consensus in Distributed Systems |
|
|
53 | (3) |
|
Time in Distributed Systems |
|
|
56 | (2) |
|
Summary and Further Reading |
|
|
58 | (3) |
|
4 An Overview of Concurrent Systems |
|
|
61 | (32) |
|
|
62 | (2) |
|
|
64 | (3) |
|
Order of Thread Execution |
|
|
67 | (1) |
|
|
68 | (10) |
|
|
69 | (4) |
|
|
73 | (5) |
|
|
78 | (1) |
|
|
79 | (3) |
|
|
82 | (2) |
|
|
84 | (2) |
|
|
86 | (2) |
|
Summary and Further Reading |
|
|
88 | (5) |
|
|
|
|
93 | (22) |
|
|
93 | (10) |
|
Application Programming Interface (API) |
|
|
94 | (3) |
|
|
97 | (3) |
|
|
100 | (3) |
|
|
103 | (3) |
|
|
106 | (1) |
|
|
107 | (6) |
|
Load Distribution Policies |
|
|
109 | (1) |
|
|
109 | (1) |
|
|
110 | (1) |
|
|
111 | (2) |
|
Summary and Further Reading |
|
|
113 | (2) |
|
|
115 | (12) |
|
|
115 | (5) |
|
|
120 | (4) |
|
|
121 | (1) |
|
Expires and Last-Modified |
|
|
121 | (1) |
|
|
122 | (2) |
|
Summary and Further Reading |
|
|
124 | (3) |
|
|
127 | (20) |
|
Introduction to Messaging |
|
|
128 | (5) |
|
|
128 | (2) |
|
|
130 | (1) |
|
|
131 | (1) |
|
|
132 | (1) |
|
|
133 | (8) |
|
Messages, Exchanges, and Queues |
|
|
133 | (2) |
|
Distribution and Concurrency |
|
|
135 | (3) |
|
Data Safety and Performance Trade-offs |
|
|
138 | (2) |
|
Availability and Performance Trade-Offs |
|
|
140 | (1) |
|
|
141 | (3) |
|
|
141 | (1) |
|
|
142 | (1) |
|
|
143 | (1) |
|
Summary and Further Reading |
|
|
144 | (3) |
|
8 Serverless Processing Systems |
|
|
147 | (16) |
|
The Attractions of Serverless |
|
|
147 | (2) |
|
|
149 | (3) |
|
|
149 | (1) |
|
|
150 | (1) |
|
|
151 | (1) |
|
|
152 | (5) |
|
Lambda Function Life Cycle |
|
|
153 | (1) |
|
|
154 | (1) |
|
|
155 | (2) |
|
Case Study: Balancing Throughput and Costs |
|
|
157 | (4) |
|
Choosing Parameter Values |
|
|
158 | (1) |
|
GAE Autoscaling Parameter Study Design |
|
|
159 | (1) |
|
|
160 | (1) |
|
Summary and Further Reading |
|
|
161 | (2) |
|
|
163 | (22) |
|
The Movement to Microservices |
|
|
164 | (8) |
|
|
164 | (2) |
|
|
166 | (2) |
|
|
168 | (2) |
|
Principles of Microservices |
|
|
170 | (2) |
|
Resilience in Microservices |
|
|
172 | (8) |
|
|
173 | (5) |
|
|
178 | (2) |
|
Summary and Further Reading |
|
|
180 | (5) |
|
Part III Scalable Distributed Databases |
|
|
|
10 Scalable Database Fundamentals |
|
|
185 | (20) |
|
|
185 | (1) |
|
Scaling Relational Databases |
|
|
186 | (6) |
|
|
186 | (2) |
|
Scaling Out: Read Replicas |
|
|
188 | (1) |
|
Scale Out: Partitioning Data |
|
|
189 | (2) |
|
|
191 | (1) |
|
|
192 | (10) |
|
|
196 | (1) |
|
|
197 | (1) |
|
|
198 | (4) |
|
|
202 | (1) |
|
Summary and Further Reading |
|
|
203 | (2) |
|
|
205 | (18) |
|
What Is Eventual Consistency? |
|
|
205 | (4) |
|
|
206 | (1) |
|
|
207 | (2) |
|
|
209 | (2) |
|
|
211 | (2) |
|
|
213 | (2) |
|
|
214 | (1) |
|
|
214 | (1) |
|
|
215 | (6) |
|
|
216 | (1) |
|
|
217 | (4) |
|
Summary and Further Reading |
|
|
221 | (2) |
|
|
223 | (24) |
|
Introduction to Strong Consistency |
|
|
224 | (2) |
|
|
226 | (1) |
|
|
227 | (5) |
|
|
228 | (2) |
|
|
230 | (2) |
|
Distributed Consensus Algorithms |
|
|
232 | (12) |
|
|
234 | (2) |
|
|
236 | (2) |
|
Strong Consistency in Practice |
|
|
238 | (1) |
|
|
238 | (3) |
|
|
241 | (3) |
|
Summary and Further Reading |
|
|
244 | (3) |
|
13 Distributed Database Implementations |
|
|
247 | (24) |
|
|
248 | (5) |
|
|
248 | (2) |
|
Distribution and Replication |
|
|
250 | (1) |
|
|
251 | (2) |
|
|
253 | (7) |
|
|
254 | (2) |
|
Distribution and Replication |
|
|
256 | (3) |
|
|
259 | (1) |
|
|
260 | (7) |
|
|
261 | (3) |
|
Distribution and Replication |
|
|
264 | (2) |
|
|
266 | (1) |
|
Summary and Further Reading |
|
|
267 | (4) |
|
Part IV Event and Stream Processing |
|
|
|
14 Scalable Event-Driven Processing |
|
|
271 | (16) |
|
Event-Driven Architectures |
|
|
272 | (2) |
|
|
274 | (10) |
|
|
275 | (1) |
|
|
276 | (3) |
|
|
279 | (4) |
|
|
283 | (1) |
|
Summary and Further Reading |
|
|
284 | (3) |
|
15 Stream Processing Systems |
|
|
287 | (16) |
|
Introduction to Stream Processing |
|
|
288 | (3) |
|
Stream Processing Platforms |
|
|
291 | (2) |
|
|
293 | (7) |
|
|
293 | (2) |
|
|
295 | (3) |
|
|
298 | (2) |
|
Conclusions and Further Reading |
|
|
300 | (3) |
|
16 Final Tips for Success |
|
|
303 | (4) |
|
|
304 | (1) |
|
|
305 | (1) |
|
|
306 | (1) |
|
|
307 | (1) |
Further Reading and Conclusions |
|
307 | (2) |
Index |
|
309 | |