Closed1

Firestore で分散カウンタを sum で作ると読み取りクエリ増大の弱点を克服できる

9sako69sako6

Firestore には分散カウンタ(Distributed Counter)という設計がある。
例えば「いいね」を付けたり外したりする機能を作る時に使う。
いいね機能を作る際、Firestore のドキュメントに likesCount のようにいいね数を直接保持してもいいだろう。しかし、Firestore においてドキュメントを更新できる頻度には制限がある。

increment オペレーションはカウンタの実装に便利ですが、1 つのドキュメントを更新できる回数は 1 秒間に 1 回だけです。この頻度を超えてカウンタを更新する必要がある場合は、分散カウンタのページを参照してください。
引用元

分散カウンタは、N 個のドキュメントにカウントを分散して持ち、更新時は N 個のうちの1個をランダムで取得してきてカウントを増減させる手法である。

実際のカウント数は、N 個のドキュメントのカウントの合計である。

N 個のドキュメントが分散してカウントを持っているので、書き込みスループットは N 倍になるというわけだ。
(ちなみに、どうやってランダムにドキュメントを1個取得するかと言うと、ドキュメントの ID を 0, 1, ..., N-1 のように単調増加する数列にしておき、Math.floor(Math.random() * N) で ID 指定するのである。)

一方、N 個のドキュメントのカウントを合計しないと欲しいカウント数が得られないので、カウント数を取得するために N の読み取りクエリが発生する。

公式ドキュメントでは上記のトレードオフが説明されたところで終了している。

読み取りクエリの増大という弱点は、集計クエリ sum で克服されているはず。

このスクラップは3ヶ月前にクローズされました