Firebase Realtime Database と Cloud Functions でジョブを定期実行する小技
オフィシャルな方法ではないけど、表題の機能をこの2つだけで実現する方法をログ。
ただし、分単位での実行やユーザの滞在時間内での話になる。
これ系の記事をググると、こういった正当な方法が出てくるので、特に制約がないのであればこっちの方がいいと思う。
けど、世の中色々な条件下での開発があるよね😇
ってことで小技を使って実現する。
更新時間を分単位で保存する
// 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 の使い方にそぐわない気もする。