surga Lab

開発したい!!

Flutter Firestoreで分散カウンタを実装する

分散カウンタを簡単なカウントアップアプリで試してみます。

分散カウンタ

多くのアプリでは、いいね数やフォロワー数のためにカウントアップが必要です。
しかしFirestoreでは、制限上1つのドキュメントにつき1秒に1回しか更新することができません。

そこで分散カウンタを利用します。

1つのドキュメントにつき1秒に1回しかできないなら、
ドキュメントをたくさん作ってしまえばいいのです。

具体的な方法

  1. カウントアップ用のコレクションを作成します。
  2. カウントアップ時はランダムにコレクション内のドキュメントを1つ選び、フィールドの値をインクリメントします。
  3. カウント取得時は、コレクション内のドキュメントの値を合計すればOKです。

簡単なサンプル

Shards数100で100回インクリメントしたところ、96まで上がりました。
4回ほど失敗しているようです。

f:id:hisurga:20190628011028g:plain:w200

Shards数500でも試したら100まで到達しました。

スループットはShards数に比例しますが、
あまりにShards数を増やすとそれだけFirestoreのコストがかかるので難しいところです。

今回のコレクションとドキュメントの構成はこれです。

f:id:hisurga:20190628005307p:plain:w400

f:id:hisurga:20190628005329p:plain:w400

雑で申し訳ないのですが、今回の実験コードはこちらです。

参考にさせていただいたサイト

分散カウンタ  |  Firebase

Firebase Cloud FirestoreのTransactionについて考える - Qiita