{"type":"excalidraw","version":2,"source":"https://AwesomeSystemDesign.dev","elements":[{"angle":0,"strokeColor":"#6577aa","backgroundColor":"#eef1fc","fillStyle":"solid","strokeWidth":1.5,"strokeStyle":"solid","roughness":0.7,"opacity":100,"version":1,"versionNonce":1,"isDeleted":false,"groupIds":["step-1"],"frameId":null,"roundness":null,"boundElements":[{"type":"text","id":"shape-1"}],"updated":0,"link":null,"locked":false,"id":"shape-0","type":"rectangle","seed":41,"x":36,"y":32,"width":292.10404,"height":68,"customData":{"revealStep":1}},{"angle":0,"strokeColor":"#394557","backgroundColor":"transparent","fillStyle":"solid","strokeWidth":1.5,"strokeStyle":"solid","roughness":0.7,"opacity":100,"version":1,"versionNonce":1,"isDeleted":false,"groupIds":["step-1"],"frameId":null,"roundness":null,"boundElements":null,"updated":0,"link":null,"locked":false,"id":"shape-1","type":"text","seed":114,"x":56,"y":54.3,"width":252.10404,"height":23.400000000000002,"fontSize":18,"fontFamily":1,"text":"Node | Heartbeat | Status","originalText":"Node | Heartbeat | Status","textAlign":"center","verticalAlign":"middle","containerId":"shape-0","lineHeight":1.3,"autoResize":false,"customData":{"revealStep":1}},{"angle":0,"strokeColor":"#628572","backgroundColor":"#edf5ee","fillStyle":"solid","strokeWidth":1.5,"strokeStyle":"solid","roughness":0.7,"opacity":100,"version":1,"versionNonce":1,"isDeleted":false,"groupIds":["step-2"],"frameId":null,"roundness":null,"boundElements":[{"type":"text","id":"shape-3"}],"updated":0,"link":null,"locked":false,"id":"shape-2","type":"rectangle","seed":187,"x":368.10404,"y":32,"width":224.38912000000002,"height":153,"customData":{"revealStep":2}},{"angle":0,"strokeColor":"#394557","backgroundColor":"transparent","fillStyle":"solid","strokeWidth":1.5,"strokeStyle":"solid","roughness":0.7,"opacity":100,"version":1,"versionNonce":1,"isDeleted":false,"groupIds":["step-2"],"frameId":null,"roundness":null,"boundElements":null,"updated":0,"link":null,"locked":false,"id":"shape-3","type":"text","seed":260,"x":388.10404,"y":50,"width":184.38912000000002,"height":117,"fontSize":18,"fontFamily":1,"text":"A | 1001 | ALIVE\nB | 998 | ALIVE\nC | 995 | ALIVE\nD | 970 | SUSPECT\nE | 940 | DOWN","originalText":"A | 1001 | ALIVE\nB | 998 | ALIVE\nC | 995 | ALIVE\nD | 970 | SUSPECT\nE | 940 | DOWN","textAlign":"center","verticalAlign":"middle","containerId":"shape-2","lineHeight":1.3,"autoResize":false,"customData":{"revealStep":2}},{"angle":0,"strokeColor":"#a68a53","backgroundColor":"#fff7e6","fillStyle":"solid","strokeWidth":1.5,"strokeStyle":"solid","roughness":0.7,"opacity":100,"version":1,"versionNonce":1,"isDeleted":false,"groupIds":["step-3"],"frameId":null,"roundness":null,"boundElements":[{"type":"text","id":"shape-5"}],"updated":0,"link":null,"locked":false,"id":"shape-4","type":"rectangle","seed":333,"x":36,"y":225,"width":565.40914,"height":500.1,"customData":{"revealStep":3}},{"angle":0,"strokeColor":"#394557","backgroundColor":"transparent","fillStyle":"solid","strokeWidth":1.5,"strokeStyle":"solid","roughness":0.7,"opacity":100,"version":1,"versionNonce":1,"isDeleted":false,"groupIds":["step-3"],"frameId":null,"roundness":null,"boundElements":null,"updated":0,"link":null,"locked":false,"id":"shape-5","type":"text","seed":406,"x":56,"y":243,"width":525.40914,"height":464.1,"fontSize":17,"fontFamily":1,"text":"Gossip Protocol\n\nEvery node periodically (every 1s) picks a random node\nand exchanges membership/heartbeat information.\n\nNode A's membership list:\n\nProtocol:\n1. Node A bumps its own heartbeat counter\n2. A picks random node (say C) and sends its full list\n3. C merges: for each node, take max(heartbeat)\n4. If a node's heartbeat hasn't increased in T_fail (30s)\n→ mark as SUSPECT\n5. If still no update after T_cleanup (60s)\n→ mark as DOWN, start data handoff\n\nProperties:\n✅ Decentralized — no single failure detector\n✅ Eventually consistent membership view\n✅ Convergence time: O(log N) gossip rounds\n❌ Temporary false positives (network blip → SUSPECT)","originalText":"Gossip Protocol\n\nEvery node periodically (every 1s) picks a random node\nand exchanges membership/heartbeat information.\n\nNode A's membership list:\n\nProtocol:\n1. Node A bumps its own heartbeat counter\n2. A picks random node (say C) and sends its full list\n3. C merges: for each node, take max(heartbeat)\n4. If a node's heartbeat hasn't increased in T_fail (30s)\n→ mark as SUSPECT\n5. If still no update after T_cleanup (60s)\n→ mark as DOWN, start data handoff\n\nProperties:\n✅ Decentralized — no single failure detector\n✅ Eventually consistent membership view\n✅ Convergence time: O(log N) gossip rounds\n❌ Temporary false positives (network blip → SUSPECT)","textAlign":"left","verticalAlign":"middle","containerId":"shape-4","lineHeight":1.3,"autoResize":false,"customData":{"revealStep":3}}],"appState":{"viewBackgroundColor":"#fbfbf8","gridSize":null},"files":{}}