不要把每一票直接写入一个数据库行——缓冲写入、对计数器分片,并接受最终计票(eventual tally)。10 分钟内 500 万票平均约为每秒 8,300 票,峰值远高于此(电视直播的某个瞬间可能是其 10 倍)。诀窍是把一个热点单行更新变成许多独立、并行的递增。
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
为什么要缓冲写入
像 这样的队列把摄取(ingestion)与计票解耦。客户端写入是一次廉价的追加(append);如果消费者在峰值期间落后,事件会在日志中等待,而不会压垮 DB。Kafka 还提供——如果消费者崩溃,你可以从最后提交的 offset 重新处理,不会丢票。
