The outage that outlives its cause.
This is a live discrete-event simulation of a service graph under timeouts, retries, and open-loop load — running in your browser, deterministically. Kill the database and retries amplify demand until the whole system collapses. Then the part nobody's intuition survives: heal the database, and the system stays down. That's a metastable failure — the mechanism behind a long list of famous outages. Flip on a circuit breaker or load shedding and watch it find its way back.
deterministic · seeded · zero backend — every preset below is enforced as a property test (P1–P16) in Zimac's CI, the simulator is validated against closed-form queueing theory (Erlang-C, Pollaczek–Khinchine, Little's law, USL, fan-out tail multiplication, hedging — conformance C1–C9; P1–P16), and this page runs that same verified engine compiled to WebAssembly
Dependency graph
t = 0sDemand vs. delivery
requests/sQueue depth
waiting requestsClient attempts
attempts/s at the front doorThe guided tour
Model your own system
Sketch an entire distributed system — every tier, call edge, client population, and outage — three ways, all equivalent and kept in sync: point-and-click builder, the Storm DSL (a line per fact, like you'd describe it at a whiteboard), or raw JSON. Every change re-runs the simulation instantly, and the permalink reproduces your exact run for anyone.
services
calls
client populations
outages & horizon
service <name> <servers> x <dist> [queue <cap>] [usl(contention, coherency)] ·
dist: 15ms | lognormal(9ms, 0.7) | pareto(2ms, 2.5) | bimodal(5ms, 0.02, 30) ·
clients [name] <rate>/s -> <entry> : <options> ·
<from> -> <to> : timeout 300ms latency 1ms retries 3 backoff 50ms..1s jitter breaker budget 10% hedge 40ms deadline ·
service opts: parallel (scatter-gather) · degraded(45s, 6s, 25) (gray failure) ·
codel(100ms, 1s) (adaptive LIFO + CoDel) · cache(0.85, 0.002, 600s, 500us) (look-aside cache) ·
edge: inflight 4 (concurrency limit) ·
kill <name> @ 60s..120s [fastfail] ·
run 300s