{"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":390,"height":387,"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":50,"width":350,"height":351,"fontSize":18,"fontFamily":1,"text":"Push Model (scheduler assigns to\nworkers)\n\nScheduler Workers\n\n-- task → worker-3 ----------->\n-- task → worker-7 ----------->\n\nScheduler tracks worker capacity,\nhealth, current load\n\nPros: optimal load balancing,\nlocality-aware placement\nCons: scheduler is a bottleneck;\ncomplex health tracking","originalText":"Push Model (scheduler assigns to\nworkers)\n\nScheduler Workers\n\n-- task → worker-3 ----------->\n-- task → worker-7 ----------->\n\nScheduler tracks worker capacity,\nhealth, current load\n\nPros: optimal load balancing,\nlocality-aware placement\nCons: scheduler is a bottleneck;\ncomplex health tracking","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":466,"y":32,"width":390,"height":504,"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":486,"y":50,"width":350,"height":468,"fontSize":18,"fontFamily":1,"text":"Pull Model (workers request tasks\n— RECOMMENDED)\n\nWorkers Ready Queue\n\n-- give me a task ------------>\n<-- here's task-ABC\n\n-- [execute] ------------------>\n\n-- give me next task --------->\n<-- here's task-DEF\n\nWorker pulls when it has capacity\n(self-regulating backpressure)\n\nPros: natural backpressure, simple,\nno single bottleneck\nCons: less control over placement;\nslight latency (poll gap)","originalText":"Pull Model (workers request tasks\n— RECOMMENDED)\n\nWorkers Ready Queue\n\n-- give me a task ------------>\n<-- here's task-ABC\n\n-- [execute] ------------------>\n\n-- give me next task --------->\n<-- here's task-DEF\n\nWorker pulls when it has capacity\n(self-regulating backpressure)\n\nPros: natural backpressure, simple,\nno single bottleneck\nCons: less control over placement;\nslight latency (poll gap)","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":576,"width":503.00588000000005,"height":146.5,"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":594,"width":463.00588000000005,"height":110.5,"fontSize":17,"fontFamily":1,"text":"Recommendation: Pull model with Redis BRPOPLPUSH\n→ Worker blocks until a task is available (no polling)\n→ Atomic move from \"ready\" list to \"processing\" list\n→ If worker crashes, task stays in \"processing\" list\n→ Timeout watchdog detects and re-enqueues","originalText":"Recommendation: Pull model with Redis BRPOPLPUSH\n→ Worker blocks until a task is available (no polling)\n→ Atomic move from \"ready\" list to \"processing\" list\n→ If worker crashes, task stays in \"processing\" list\n→ Timeout watchdog detects and re-enqueues","textAlign":"left","verticalAlign":"middle","containerId":"shape-4","lineHeight":1.3,"autoResize":false,"customData":{"revealStep":3}}],"appState":{"viewBackgroundColor":"#fbfbf8","gridSize":null},"files":{}}