각 표를 곧바로 데이터베이스 row에 write하지 마십시오 — write를 버퍼링하고, 카운터를 shard하며, 최종적 집계(eventual tally)를 받아들이십시오. 10분에 500만 표는 평균 초당 약 8,300표이며, 스파이크는 훨씬 높습니다(생방송 순간이 그 10배가 될 수 있음). 요령은 hot single-row 업데이트를 여러 독립적, 병렬적 증가로 바꾸는 것입니다.
Client ─▶ Edge/API ─▶ Kafka (vote events) ─▶ Consumers ─┬─▶ Dedup store (SET one-vote)
(durable buffer) └─▶ Sharded counters (INCR N shards)
│
Redis/Aggregator ◀── periodic sum of shards ──────────────────────┘
│
└─▶ Read replica / CDN cache ─▶ Live tally to clients
왜 write를 버퍼링하는가
같은 큐는 수집(ingestion)과 집계(tallying)를 분리합니다. 클라이언트 write는 저렴한 append이며, 스파이크 동안 consumer가 뒤처져도 이벤트는 DB를 압도하는 대신 로그에서 대기합니다. Kafka는 또한 **리플레이(replay)**를 제공합니다 — consumer가 crash되면 마지막 커밋된 offset부터 표를 잃지 않고 재처리합니다.
