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

https://fly.io/dist-sys/

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

Atlas of consistency models

https://jepsen.io/consistency

Issues found in real-world systems

https://jepsen.io/analyses