各票をデータベースの行に直接書き込んではいけません。書き込みをバッファリングし、カウンターをシャーディングし、結果整合な集計を受け入れます。10分で500万票は平均で約8,300票/秒、スパイクははるかに高くなります(ライブTVの瞬間はその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
なぜ書き込みをバッファリングするのか
のようなキューは、取り込みと集計を分離します。クライアントの書き込みは安価なappendです。スパイク中にconsumerが遅れても、イベントはDBを圧倒する代わりにログで待機します。Kafkaはも提供します。consumerがクラッシュしても、最後にコミットしたオフセットから票を失うことなく再処理できます。
