{"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"},{"type":"arrow","id":"shape-8"}],"updated":0,"link":null,"locked":false,"id":"shape-0","type":"rectangle","seed":41,"x":36,"y":32,"width":192,"height":106.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":56,"y":50,"width":152,"height":70.2,"fontSize":18,"fontFamily":1,"text":"View\nEvent\n(client)","originalText":"View\nEvent\n(client)","textAlign":"center","verticalAlign":"middle","containerId":"shape-0","lineHeight":1.3,"autoResize":false,"customData":{"revealStep":1}},{"angle":0,"strokeColor":"#7c899d","backgroundColor":"transparent","fillStyle":"solid","strokeWidth":1.5,"strokeStyle":"solid","roughness":0.4,"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-8","type":"arrow","seed":625,"x":132,"y":138.2,"width":0,"height":82.00000000000003,"points":[[0,0],[0,41],[0,82.00000000000003]],"lastCommittedPoint":null,"startBinding":{"elementId":"shape-0","focus":0,"gap":1},"endBinding":{"elementId":"shape-2","focus":0,"gap":1},"startArrowhead":null,"endArrowhead":"arrow","elbowed":false,"customData":{"revealStep":2}},{"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"},{"type":"arrow","id":"shape-8"},{"type":"arrow","id":"shape-9"}],"updated":0,"link":null,"locked":false,"id":"shape-2","type":"rectangle","seed":187,"x":36,"y":220.20000000000002,"width":192,"height":82.80000000000001,"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":56,"y":238.20000000000002,"width":152,"height":46.800000000000004,"fontSize":18,"fontFamily":1,"text":"Kafka\n(buffer)","originalText":"Kafka\n(buffer)","textAlign":"center","verticalAlign":"middle","containerId":"shape-2","lineHeight":1.3,"autoResize":false,"customData":{"revealStep":2}},{"angle":0,"strokeColor":"#7c899d","backgroundColor":"transparent","fillStyle":"solid","strokeWidth":1.5,"strokeStyle":"solid","roughness":0.4,"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-9","type":"arrow","seed":698,"x":132,"y":303,"width":0,"height":82,"points":[[0,0],[0,41],[0,82]],"lastCommittedPoint":null,"startBinding":{"elementId":"shape-2","focus":0,"gap":1},"endBinding":{"elementId":"shape-4","focus":0,"gap":1},"startArrowhead":null,"endArrowhead":"arrow","elbowed":false,"customData":{"revealStep":3}},{"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"},{"type":"arrow","id":"shape-9"},{"type":"arrow","id":"shape-10"}],"updated":0,"link":null,"locked":false,"id":"shape-4","type":"rectangle","seed":333,"x":36,"y":385,"width":192,"height":106.2,"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":403,"width":152,"height":70.2,"fontSize":18,"fontFamily":1,"text":"Counter\nService\n(batch)","originalText":"Counter\nService\n(batch)","textAlign":"center","verticalAlign":"middle","containerId":"shape-4","lineHeight":1.3,"autoResize":false,"customData":{"revealStep":3}},{"angle":0,"strokeColor":"#7c899d","backgroundColor":"transparent","fillStyle":"solid","strokeWidth":1.5,"strokeStyle":"solid","roughness":0.4,"opacity":100,"version":1,"versionNonce":1,"isDeleted":false,"groupIds":["step-4"],"frameId":null,"roundness":null,"boundElements":null,"updated":0,"link":null,"locked":false,"id":"shape-10","type":"arrow","seed":771,"x":132,"y":491.20000000000005,"width":0,"height":82,"points":[[0,0],[0,41],[0,82]],"lastCommittedPoint":null,"startBinding":{"elementId":"shape-4","focus":0,"gap":1},"endBinding":{"elementId":"shape-6","focus":0,"gap":1},"startArrowhead":null,"endArrowhead":"arrow","elbowed":false,"customData":{"revealStep":4}},{"angle":0,"strokeColor":"#9180ac","backgroundColor":"#f4effb","fillStyle":"solid","strokeWidth":1.5,"strokeStyle":"solid","roughness":0.7,"opacity":100,"version":1,"versionNonce":1,"isDeleted":false,"groupIds":["step-4"],"frameId":null,"roundness":null,"boundElements":[{"type":"text","id":"shape-7"},{"type":"arrow","id":"shape-10"}],"updated":0,"link":null,"locked":false,"id":"shape-6","type":"rectangle","seed":479,"x":36,"y":573.2,"width":192,"height":106.2,"customData":{"revealStep":4}},{"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-4"],"frameId":null,"roundness":null,"boundElements":null,"updated":0,"link":null,"locked":false,"id":"shape-7","type":"text","seed":552,"x":56,"y":591.2,"width":152,"height":70.2,"fontSize":18,"fontFamily":1,"text":"DB\n(async\nflush)","originalText":"DB\n(async\nflush)","textAlign":"center","verticalAlign":"middle","containerId":"shape-6","lineHeight":1.3,"autoResize":false,"customData":{"revealStep":4}},{"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-5"],"frameId":null,"roundness":null,"boundElements":[{"type":"text","id":"shape-12"}],"updated":0,"link":null,"locked":false,"id":"shape-11","type":"rectangle","seed":844,"x":36,"y":719.4000000000001,"width":586.7808600000001,"height":699,"customData":{"revealStep":5}},{"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-5"],"frameId":null,"roundness":null,"boundElements":null,"updated":0,"link":null,"locked":false,"id":"shape-12","type":"text","seed":917,"x":56,"y":737.4000000000001,"width":546.7808600000001,"height":663,"fontSize":17,"fontFamily":1,"text":"View Count Architecture\n\nProblem: 5B views/day. Can't UPDATE counter on every view.\nThat's 58K writes/sec to a single row for viral videos.\n\nSolution: Multi-layer aggregation\n\nLayer 1: Client-side dedup\n- Don't count refreshes within 30s\n- Don't count views < 30s of watch time\n- Device fingerprint to detect bots\n\nLayer 2: Kafka buffering\n- All view events go to Kafka topic\n- Partitioned by video_id\n\nLayer 3: Counter service\n- Consumes from Kafka in micro-batches (every 5s)\n- Aggregates counts in memory (Redis)\n- Flushes to DB every 30s per video\n- Redis: INCR \"views:video_abc\" (atomic increment)\n\nLayer 4: DB update\n- Batch UPDATE videos SET view_count = view_count + N\nWHERE video_id IN (...)\n- Runs every 30-60 seconds\n- Single update per video regardless of view volume\n\nDisplay: Read from Redis (real-time) for hot videos\nRead from DB for long-tail videos","originalText":"View Count Architecture\n\nProblem: 5B views/day. Can't UPDATE counter on every view.\nThat's 58K writes/sec to a single row for viral videos.\n\nSolution: Multi-layer aggregation\n\nLayer 1: Client-side dedup\n- Don't count refreshes within 30s\n- Don't count views < 30s of watch time\n- Device fingerprint to detect bots\n\nLayer 2: Kafka buffering\n- All view events go to Kafka topic\n- Partitioned by video_id\n\nLayer 3: Counter service\n- Consumes from Kafka in micro-batches (every 5s)\n- Aggregates counts in memory (Redis)\n- Flushes to DB every 30s per video\n- Redis: INCR \"views:video_abc\" (atomic increment)\n\nLayer 4: DB update\n- Batch UPDATE videos SET view_count = view_count + N\nWHERE video_id IN (...)\n- Runs every 30-60 seconds\n- Single update per video regardless of view volume\n\nDisplay: Read from Redis (real-time) for hot videos\nRead from DB for long-tail videos","textAlign":"left","verticalAlign":"middle","containerId":"shape-11","lineHeight":1.3,"autoResize":false,"customData":{"revealStep":5}}],"appState":{"viewBackgroundColor":"#fbfbf8","gridSize":null},"files":{}}