walkingmask’s development log

IT系の情報などを適当に書いていきます

MENU

Firebase Realtime Database と Cloud Functions でジョブを定期実行する小技

オフィシャルな方法ではないけど、表題の機能をこの2つだけで実現する方法をログ。

ただし、分単位での実行やユーザの滞在時間内での話になる。

developers-jp.googleblog.com

これ系の記事をググると、こういった正当な方法が出てくるので、特に制約がないのであればこっちの方がいいと思う。

けど、世の中色々な条件下での開発があるよね😇

ってことで小技を使って実現する。

更新時間を分単位で保存する

// front.js
// 1000ms毎に値を保存する
setInterval(() => {
    dbRef.child('updatedAt').set(parseInt(Date.now()/(60*1000)));
}, 1000);

// cfunctions.js
// updatedAtを監視
exports.watchUpdatedAt = functions.database.ref('updatedAt')
    .onUpdate((change, context) => {
      // 処理
    });

処理の流れはだいたいこんな感じ。

ポイントは

  • FRDはsetした値に変化がなければリモートと同期しない(はず)
  • updatedAtは分単位のタイムスタンプなので、1分おきにしか更新されない
  • これをsetIntervalでフロントで更新してローカルのFRDにsetする
  • ローカルとリモートの値が違う時にwatchUpdatedAtがトリガー

って感じ。

FRD は送受信に、CloudFunctions は呼び出し回数や計算時間に課金されるので、フロントでいかに負荷分散できるかなのかな。

本当はもっとまともな方法ある気もするし、FRD の使い方にそぐわない気もする。