<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Distributed Systems on Software Engineering Learning Paths</title><link>https://kyngo.github.io/learning-paths/paths/distributed-systems/</link><description>Recent content in Distributed Systems on Software Engineering Learning Paths</description><generator>Hugo</generator><language>en</language><atom:link href="https://kyngo.github.io/learning-paths/paths/distributed-systems/index.xml" rel="self" type="application/rss+xml"/><item><title>Distributed Systems Fundamentals</title><link>https://kyngo.github.io/learning-paths/paths/distributed-systems/01-fundamentals/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kyngo.github.io/learning-paths/paths/distributed-systems/01-fundamentals/</guid><description>&lt;h1 id="distributed-systems-fundamentals"&gt;Distributed Systems Fundamentals&lt;a class="anchor" href="#distributed-systems-fundamentals"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;A distributed system is a collection of independent computers that appears to its users as a single coherent system. This deceptively simple definition hides enormous complexity — complexity that has broken production systems at every scale, from startups to hyperscalers.&lt;/p&gt;
&lt;p&gt;This section covers &lt;strong&gt;why&lt;/strong&gt; distributed systems are fundamentally harder than single-node systems, the theoretical limits that constrain what is possible, and the models we use to reason about them.&lt;/p&gt;</description></item><item><title>Time &amp; Ordering</title><link>https://kyngo.github.io/learning-paths/paths/distributed-systems/02-time-and-ordering/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kyngo.github.io/learning-paths/paths/distributed-systems/02-time-and-ordering/</guid><description>&lt;h1 id="time--ordering"&gt;Time &amp;amp; Ordering&lt;a class="anchor" href="#time--ordering"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;In a single-node system, &amp;ldquo;what happened first?&amp;rdquo; has a straightforward answer — the CPU&amp;rsquo;s instruction counter provides a total order. In a distributed system, this question becomes one of the hardest problems in computer science. There is no global clock, no shared counter, and no way to determine the exact order of events across nodes without communication.&lt;/p&gt;
&lt;p&gt;This section covers the tools we use to establish ordering in distributed systems — from physical clocks (and why they fail) to logical clocks that capture causality without relying on time at all.&lt;/p&gt;</description></item><item><title>Consistency Models</title><link>https://kyngo.github.io/learning-paths/paths/distributed-systems/03-consistency-models/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kyngo.github.io/learning-paths/paths/distributed-systems/03-consistency-models/</guid><description>&lt;h1 id="consistency-models"&gt;Consistency Models&lt;a class="anchor" href="#consistency-models"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;When data is replicated across multiple nodes, different replicas can disagree about the current state. A &lt;strong&gt;consistency model&lt;/strong&gt; defines the rules about what values a read operation can return and when writes become visible. Choosing the right consistency model is one of the most consequential design decisions in a distributed system — it determines the tradeoff between correctness, performance, and availability.&lt;/p&gt;
&lt;p&gt;This section covers the hierarchy of consistency models from strongest to weakest, the guarantees each provides, and when to use them.&lt;/p&gt;</description></item><item><title>Consensus Algorithms</title><link>https://kyngo.github.io/learning-paths/paths/distributed-systems/04-consensus-algorithms/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kyngo.github.io/learning-paths/paths/distributed-systems/04-consensus-algorithms/</guid><description>&lt;h1 id="consensus-algorithms"&gt;Consensus Algorithms&lt;a class="anchor" href="#consensus-algorithms"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Consensus is the problem of getting multiple nodes to agree on a single value, even when some nodes crash or messages are lost. It is the foundation of replicated state machines, leader election, distributed locks, and total order broadcast.&lt;/p&gt;
&lt;p&gt;The FLP impossibility result (Section 1) proves that deterministic consensus is impossible in a purely asynchronous system. Practical algorithms sidestep this by assuming &lt;strong&gt;partial synchrony&lt;/strong&gt; — the system is eventually timely enough for progress, even if delays occur.&lt;/p&gt;</description></item><item><title>Replication</title><link>https://kyngo.github.io/learning-paths/paths/distributed-systems/05-replication/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kyngo.github.io/learning-paths/paths/distributed-systems/05-replication/</guid><description>&lt;h1 id="replication"&gt;Replication&lt;a class="anchor" href="#replication"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Replication — maintaining copies of data on multiple nodes — serves three goals: &lt;strong&gt;fault tolerance&lt;/strong&gt; (surviving node failures), &lt;strong&gt;lower latency&lt;/strong&gt; (serving reads from nearby replicas), and &lt;strong&gt;higher throughput&lt;/strong&gt; (distributing load). The challenge is keeping replicas consistent while maximising performance and availability.&lt;/p&gt;
&lt;p&gt;This section covers the three fundamental replication topologies, the consistency problems each introduces, and the strategies for resolving conflicts.&lt;/p&gt;
&lt;h2 id="single-leader-replication"&gt;Single-Leader Replication&lt;a class="anchor" href="#single-leader-replication"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In single-leader (also called primary-backup or master-slave) replication, one node is designated the &lt;strong&gt;leader&lt;/strong&gt;. All writes go to the leader, which replicates changes to followers.&lt;/p&gt;</description></item><item><title>Partitioning &amp; Sharding</title><link>https://kyngo.github.io/learning-paths/paths/distributed-systems/06-partitioning-and-sharding/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kyngo.github.io/learning-paths/paths/distributed-systems/06-partitioning-and-sharding/</guid><description>&lt;h1 id="partitioning--sharding"&gt;Partitioning &amp;amp; Sharding&lt;a class="anchor" href="#partitioning--sharding"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;When a dataset grows beyond what a single node can store or serve, it must be split across multiple nodes. &lt;strong&gt;Partitioning&lt;/strong&gt; (also called &lt;strong&gt;sharding&lt;/strong&gt;) divides data so each node is responsible for a subset. Combined with replication (Section 5), partitioning enables systems to scale both storage and throughput horizontally.&lt;/p&gt;
&lt;p&gt;This section covers the strategies for partitioning data, the mechanisms for distributing partitions across nodes, and the problems that arise when you get it wrong.&lt;/p&gt;</description></item><item><title>Distributed Transactions</title><link>https://kyngo.github.io/learning-paths/paths/distributed-systems/07-distributed-transactions/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kyngo.github.io/learning-paths/paths/distributed-systems/07-distributed-transactions/</guid><description>&lt;h1 id="distributed-transactions"&gt;Distributed Transactions&lt;a class="anchor" href="#distributed-transactions"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;A distributed transaction spans multiple nodes, partitions, or services. It must either commit on &lt;strong&gt;all&lt;/strong&gt; participants or abort on &lt;strong&gt;all&lt;/strong&gt; — partial completion is not acceptable. This is far harder than single-node transactions because any participant can crash, and the network can partition at any point during the protocol.&lt;/p&gt;
&lt;p&gt;This section covers the classical protocols (2PC, 3PC), modern approaches (deterministic databases, Spanner&amp;rsquo;s TrueTime), and the coordination mechanisms that make them work.&lt;/p&gt;</description></item><item><title>CRDTs &amp; Eventual Consistency</title><link>https://kyngo.github.io/learning-paths/paths/distributed-systems/08-crdts/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kyngo.github.io/learning-paths/paths/distributed-systems/08-crdts/</guid><description>&lt;h1 id="crdts--eventual-consistency"&gt;CRDTs &amp;amp; Eventual Consistency&lt;a class="anchor" href="#crdts--eventual-consistency"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Conflict-free Replicated Data Types (CRDTs) are data structures that can be replicated across multiple nodes, modified independently and concurrently, and merged automatically — &lt;strong&gt;always converging&lt;/strong&gt; to the same state without coordination. They provide &lt;strong&gt;strong eventual consistency&lt;/strong&gt; (Section 3): any two replicas that have received the same set of updates are in the same state, immediately.&lt;/p&gt;
&lt;p&gt;This section covers the theory behind CRDTs, the most important CRDT types, and the anti-entropy mechanisms that propagate updates between replicas.&lt;/p&gt;</description></item><item><title>Failure Detection &amp; Recovery</title><link>https://kyngo.github.io/learning-paths/paths/distributed-systems/09-failure-detection-and-recovery/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kyngo.github.io/learning-paths/paths/distributed-systems/09-failure-detection-and-recovery/</guid><description>&lt;h1 id="failure-detection--recovery"&gt;Failure Detection &amp;amp; Recovery&lt;a class="anchor" href="#failure-detection--recovery"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;In a distributed system, detecting whether a remote node has failed is fundamentally uncertain. You cannot distinguish between a crashed node, a slow node, and a partitioned network — all three look the same from the outside: no response. This section covers the mechanisms systems use to detect failures, maintain cluster membership, and recover data after failures.&lt;/p&gt;
&lt;blockquote class='book-hint '&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Application-level resilience patterns (circuit breakers, retries, bulkheads) are covered in &lt;a href="https://kyngo.github.io/learning-paths/paths/system-design/09-reliability-resilience/"&gt;System Design: Reliability &amp;amp; Resilience&lt;/a&gt;. This section focuses on infrastructure-level failure detection and data recovery mechanisms.&lt;/p&gt;</description></item><item><title>Case Studies</title><link>https://kyngo.github.io/learning-paths/paths/distributed-systems/10-case-studies/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kyngo.github.io/learning-paths/paths/distributed-systems/10-case-studies/</guid><description>&lt;h1 id="case-studies"&gt;Case Studies&lt;a class="anchor" href="#case-studies"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Theory without practice is incomplete. This section examines how six influential distributed systems apply the concepts from this path. Each case study highlights the key architecture decisions, the tradeoffs accepted, and the lessons learned.&lt;/p&gt;
&lt;h2 id="amazon-dynamo"&gt;Amazon Dynamo&lt;a class="anchor" href="#amazon-dynamo"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Paper:&lt;/strong&gt; &amp;ldquo;Dynamo: Amazon&amp;rsquo;s Highly Available Key-value Store&amp;rdquo; (DeCandia et al., 2007)&lt;/p&gt;
&lt;p&gt;Dynamo was built for Amazon&amp;rsquo;s shopping cart — a system where availability must never be sacrificed, even at the cost of consistency. It pioneered many ideas that later appeared in Cassandra, Riak, and DynamoDB.&lt;/p&gt;</description></item></channel></rss>