{"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":16,"y":16,"width":288,"height":93.2,"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":36,"y":34,"width":248,"height":57.2,"fontSize":22,"fontFamily":1,"text":"Node | Heartbeat |\nStatus","originalText":"Node | Heartbeat |\nStatus","textAlign":"left","verticalAlign":"middle","containerId":"shape-0","lineHeight":1.3,"autoResize":false,"customData":{"revealStep":1}},{"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-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":16,"y":153.2,"width":288,"height":179,"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":36,"y":171.2,"width":248,"height":143,"fontSize":22,"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":"left","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":16,"y":376.2,"width":288,"height":1351.6000000000001,"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":36,"y":394.2,"width":248,"height":1315.6000000000001,"fontSize":22,"fontFamily":1,"text":"Gossip Protocol\n\nEvery node\nperiodically (every 1s)\npicks a random node\nand exchanges\nmembership/heartbeat\ninformation.\n\nNode A's membership\nlist:\n\nProtocol:\n1. Node A bumps its\nown heartbeat\ncounter\n2. A picks random\nnode (say C) and\nsends its full list\n3. C merges: for\neach node, take\nmax(heartbeat)\n4. If a node's\nheartbeat hasn't\nincreased in T_fail\n(30s)\n→ mark as SUSPECT\n5. If still no update\nafter T_cleanup\n(60s)\n→ mark as DOWN,\nstart data handoff\n\nProperties:\n✅ Decentralized — no\nsingle failure\ndetector\n✅ Eventually\nconsistent membership\nview\n✅ Convergence time:\nO(log N) gossip\nrounds\n❌ Temporary false\npositives (network\nblip → SUSPECT)","originalText":"Gossip Protocol\n\nEvery node\nperiodically (every 1s)\npicks a random node\nand exchanges\nmembership/heartbeat\ninformation.\n\nNode A's membership\nlist:\n\nProtocol:\n1. Node A bumps its\nown heartbeat\ncounter\n2. A picks random\nnode (say C) and\nsends its full list\n3. C merges: for\neach node, take\nmax(heartbeat)\n4. If a node's\nheartbeat hasn't\nincreased in T_fail\n(30s)\n→ mark as SUSPECT\n5. If still no update\nafter T_cleanup\n(60s)\n→ mark as DOWN,\nstart data handoff\n\nProperties:\n✅ Decentralized — no\nsingle failure\ndetector\n✅ Eventually\nconsistent membership\nview\n✅ Convergence time:\nO(log N) gossip\nrounds\n❌ Temporary false\npositives (network\nblip → SUSPECT)","textAlign":"left","verticalAlign":"middle","containerId":"shape-4","lineHeight":1.3,"autoResize":false,"customData":{"revealStep":3}}],"appState":{"viewBackgroundColor":"#fbfbf8","gridSize":null},"files":{}}