From the foundations up
http://muratbuffalo.blogspot.com/2020/06/learning-about-distributed-systems.html
Programming models
https://www.shadaj.me/writing/distributed-programming-stalled
External-distribution:
software is written as sequential logic that runs against a state management system with sequential semantics
- Stateless Services with a Distributed Database (Aurora DSQL, Cockroach)
- Services using gossiped CRDT state (Ditto, ElectricSQL, Redis Enterprise)
- Workflows and Step Functions
Static-location:
classic way to write distributed code. You compose several units—each written as local (single-machine) code that communicates with other machines using asynchronous network calls
- Services communicating with API calls, possibly using async / await (gRPC, REST)
- Actors (Akka, Ray, Orleans)
- Services polling and pushing to a shared pub/sub (Kafka)
Arbitrary-location:
letting us write code as if it were running on a single machine, but at runtime the software is dynamically executed across several machines
- Distributed SQL Engines
- MapReduce Frameworks (Hadoop, Spark)
- Stream Processing (Flink, Spark Streaming, Storm)
- Durable Execution (Temporal, DBOS, Azure Durable Functions)
Durable execution
https://www.dbos.dev/blog/durable-execution-coding-comparison
Exercises on distributed systems
- in Go
- with Maelstrom
https://youtu.be/gboGyccRVXI?si=kC_YDPHip2qygoMd
System design / architecture
https://github.com/donnemartin/system-design-primer
https://martinfowler.com/articles/patterns-of-distributed-systems/
Interview
https://interviewing.io/guides/system-design-interview
Awesome discussion on distributed systems
- metastability
- effects when moving from dedicated hardware to cloud environment https://queue.acm.org/detail.cfm?id=3458812