以前考案した Firestore でカウントアップする ID を返す API ですが、うまくいかなかったので、その時のメモをここに残します。
背景
Firestore のドキュメントへの書き込みにはリミットがあり、ドキュメントへの最大継続書き込み速度は1秒あたり1回となっています。
https://firebase.google.com/docs/firestore/quotas?hl=ja#soft_limits
Firestore の分散カウンタについてメモ
Firestore の分散カウンタは、ドキュメントのサブコレクションに 「シャード」 を定義して、書き込み先のドキュメントを増やし分散させることで書き込み速度を増やすという手法です。
シャードを5個作ると、単一のカウンタの5倍の書き込み処理ができるようになります。
以前考えていたもの
処理の流れ
- Firestore のシャード: 5
- Cloud Run からIDのリクエストを受ける
- ランダムに選択したシャードに対してカウントアップ操作
- 各シャードの合計値を集計して ID を生成し、レスポンスを返す
図
説明
- Cloud Run: ID 生成のリクエストを送信
- Firestore: Shard 選択 シャード(5つ)の中からランダムに1つを選択してカウントを増やす
- 各Shardのカウントアップ: シャードに対して「+1」操作を実行
- 合計値の計算: 各シャードのカウント値を合計し、新しい ID を生成
問題点
同接が多いとランダムに選択されたシャード書き込み時の合計値の算出が同じタイミングで重複 ID が採番されてしまう。