Distributed Systems Playground Open the Playground

A guided tour#

Seven scenarios, in order, each showing one thing the playground is for. Open the live demo and follow along; every step takes a couple of minutes.

1. Flooding on a grid#

Load Flooding broadcast from the Example menu. Twelve processes sit on a grid; process p1 broadcasts "hello" at time 0 and p12 broadcasts "ok" 40 ms later.

2. When synchrony is only an assumption#

Load FloodSet consensus. Four processes propose random values, exchange everything they know for f + 1 = 2 rounds, and decide the minimum.

With the Ideal synchronous preset, rounds are executed in lockstep: every message of round r arrives in round r, and every process decides the same value. The dashed vertical lines on the diagram are round boundaries.

Switch to Realistic synchronous and run with the same seed (5). The algorithm still believes in rounds, but now each process opens its rounds according to its own drifting clock, and delays follow a long-tailed distribution. Messages that arrive after the recipient closed the round are discarded, as the policy says, and drawn as dashed red lines.

FloodSet under realistic timing: late messages are drawn as dashed red lines and one process decides differently from the others

At the end of the run, p2 decides 7 while every other process decides 3. Nothing in the code is wrong. The algorithm was proved for a model the network did not follow, and the omissions caused by late messages exceed what FloodSet tolerates. The Timing tab shows the delay histogram and the percentage of messages that exceed DELTA, which makes the risk visible before running anything.

3. Detecting failures without a clock you can trust#

Load Failure detector ◇P. Four processes exchange heartbeats and suspect any process that does not answer before a timeout. Process p3 crashes at 6 s.

The network is partially synchronous: before GST (3 s, the amber line on the diagram) delays follow a heavy-tailed Pareto distribution, afterwards they are bounded. The algorithm does not know the bound.

The State tab shows suspected and delay changing over time, which is the eventual accuracy property made concrete.

4. Splitting the network#

Load Failure detector across a partition and a recovery. It runs the same detector on five processes, with three scheduled faults:

Follow the bubbles and the State tab:

5. Changing what happened#

Pause any run, select a process or a link and use the controls in the bar under the graph:

The simulation is recomputed and playback resumes from the same instant. Because every source of randomness is seeded per link and per process, everything before the cursor stays exactly as it was, and you can compare the two futures.

6. Following events through the stack#

Load Reliable broadcast when the sender crashes. The program is a small newsroom on top of a stack of library modules: eager reliable broadcast, best-effort broadcast and perfect links with acknowledgements. The network loses 40% of the messages, and p1 crashes 40 ms after publishing.

The stack view of process p2 during a reliable broadcast, with messages colored by the module that originated them

7. Asking what caused what#

Load Causal order broadcast: questions before answers. p1 posts a question, p2 answers as soon as it reads it, and the channels do not preserve order.

Causality mode: the causal past of an event is shaded in blue and its causal future in amber

Where to go next#

Generated from docs/tour.md. Released under the MIT License.