Schedule Firestore writesを使って遅延書き込みをするFirebaseExtensionsの紹介

公開:2021/02/05
更新:2021/02/11
4 min読了の目安(約4400字TECH技術記事

こんにちは。もぐめっとです。

冬のキャンプは胸が震えるほど寒かったですけど虫がいなくてよかったです。

前回の記事(Set Auth claims with FirestoreというFirebase Extensionsを使ってClaimsの設定を行う方法)に引き続いて今回はSchedule Firestore writesを紹介します。

Schedule Firestore writes

queue用のコレクションにデータを追加すると対象ドキュメントにデータを後で書き込んでくれるというありそうでなかった遅延書き込みをお手軽に実装できます。
リマインダーとかそういったものに使えますね。
これが早く出ていればワンナイト人狼オンラインのタイマー処理とかで使いたかった・・・(よかったら遊んでね)

インストール方法

リポジトリより、「Install on Firebase」ボタンを押下します。

もしくはコマンドでインストールでも可

firebase ext:install firestore-schedule-writes --project=<your-project-id>

プロジェクトを選択します

「確認しました」を押下

「次へ」を押下

Blazeにしてない人はBlazeにプランをアップグレードして次へ

次へ

下記を入力して「拡張機能をインストール」を押下

  • Cloud Functions location: 日本人なんでTokyoに
  • Message Queue Collection: queueを発行するコレクション名を指定します
  • Target Collection: キューに入っている書き込みが処理される際に、どのコレクションに配送されるかを指定します。指定された場合、ターゲット・コレクション以外では書き込みは実行されません。ブランクの場合は、各スケジューリングされた書き込みが独自のターゲットコレクションを指定することができます。(ちょっとよくわからない)
  • Merge Writes: trueにしておけば既にデータがあった場合はそのデータを残してくれるのでとりあえず不整合を起こさないためにもtrueにしておきます
  • Staleness Threshold (in minutes) : スケジュールされたメッセージが古いものとして放棄されるまでの時間(分単位)。0または空白の場合は不定とみなされます。
  • Cleanup Policy: キューコレクション内のメッセージを正常に配信された後に処理する方法。残すか、消すかのどちらかを選べます。とりあえず履歴がわかるようにKeep after processingを選んで残しておきます。
  • Processing Schedule: 配信のためにメッセージを評価するスケジュール(cron構文)を指定します。デフォルトは毎分です。

インストールが終わるまでしばし待ちます。

インストールが終わるまでの待ち時間でもいいですが、インデックスをはっつけときましょう。(設定したコレクションによって変わります)
インデックス例:

{
  "indexes": [
    {
      "collectionGroup": "queued_writes",
      "queryScope": "COLLECTION",
      "fields": [
        { "fieldPath": "state", "order": "ASCENDING" },
        { "fieldPath": "deliverTime", "order": "ASCENDING" }
      ]
    },
    {
      "collectionGroup": "queued_writes",
      "queryScope": "COLLECTION",
      "fields": [
        { "fieldPath": "state", "order": "ASCENDING" },
        { "fieldPath": "leaseExpireTime", "order": "ASCENDING" }
      ]
    }
  ]
}

以上でインストール終了です。

動かしてみる

では試しに動かして見ましょう。

queued_writesコレクションに遅延データを書き込んでみます。使用できるフィールドは下記になります。

  • state: PENDINGを必ずセット。
  • deliverTime: 書き込みする時間をセット
  • data: updateするデータをmapで定義
  • collection: 書き込みするコレクションを指定。インストール時にtarget collectionを指定していたら無視されます
  • id: documentIDの指定。なければ自動生成されます
  • serverTimestampFields: サーバーのタイムスタンプを入れたいフィールド名を指定します。createTimeとか入れておけば実行された時間を自動的に追加してupdateしてくれます
  • invalidAfterTime: 処理に成功した場合でも、書き込みが配信されないようにするための時間。問題が発生してキューに入っている書き込みの処理ができなくなった場合、このフィールドを使用することで、処理が再開された後に古い書き込みや古い書き込みが配信されないようにすることができます。

とりあえずstate, deliverTime, data, collection, idがあれば動かせるので書き込んでみます。

しばらく待つとstateがDELIVEREDに変わりました。

指定したドキュメントも無事updateされています。便利!!

ちなみにエラーが発生した場合はちゃんとその内容を書いてくれます。優しい。

まとめ

Schedule Firestore writesを使うと遅延書き込みが簡単にできちゃいます!
ただ、指定したスケジュールでCloudFunctionsが動きまくりますので、コストにはお気をつけください!

[最後に宣伝]

こんなサービス作ってるのでよかったら使ってみてください!

ワンナイト人狼 for mobile
ワンナイト人狼オンライン(ガッツリfirebase使ってます。)
気軽に投稿できるフォトコンサイト - Camecon
連絡先を交換しなくてもグルチャができる - Offcha