ストックドッグ

KatoTakahiro。金融系の会社で働くSEが株やPython、その他諸々について書いています。サービスも運営してます→http://fmbrain.work

firebase realtime databaseのon()とonce()の違い

on()とonce()の使い分け

Firebase realtime databaseの公式ドキュにはサラッとしか書かれていないので、備忘を兼ねて記事に。

全くWeb周り詳しくないので記事レベルはあしからず。

firebase.google.com


ちなみに、on()とはdatabaseを読みにいくときのメソッドのこと。

const sampleRef = firebase.database().ref('sample')
sampleRef.on('value', function(snapshot){
	console.log('value', snapshot.val())
})


場合によっては、.once()で書くこともある。

const sampleRef = firebase.database().ref('sample')
sampleRef.once('value', function(snapshot){
	console.log('value', snapshot.val())
})

その使い分けって、どうやって決めてんのって記事です。

通常DBとrealtime databaseの違い

on()とonce()の使い分けは、realtime databaseの特殊スキル「リアルタイム」を使いたいか、使いたくないかで決まります。

通常のDBの更新は以下の図になります。

(更新の成功の有無のリターンコードは省いています。)


f:id:doz13189:20190203025836p:plain



realtime databaseの場合は、以下の図になります。


f:id:doz13189:20190203025939p:plain


以下の公式ドキュの記載にもある通り、realtime databaseは更新されるたびにクライアント側に同期しにいきます。

一般的な HTTP リクエストではなくデータ同期を使用します。データが変更されるたびに、接続されているあらゆる端末がその更新を数ミリ秒以内に受信します。

on()とonce()の使い分け

  • 更新された内容をクライアント側に同期したいときは.on()
  • 不要のときは.once()を使います。


.once()の場合のデータ取得は1回で終わりで、同期は不要である、ということになります。


f:id:doz13189:20190203030150p:plain

基本は.once()を使えばいい

チャットアプリのように変更を常にリッスン(監視)して、データを常に同期する必要があれば.on()を使いますが...

.on()にするということはすなわち、クライアント側とrealtime databaseが常に接続している状態です。

例えば、5台のクライアントがあり、そのうち1台のクライアントが更新処理をすると、1回の更新で5回の同期処理がはしることになります。


f:id:doz13189:20190203030249p:plain


これがクライアント100台、1000台と増えてくると、トランザクションは圧倒的に増えていきます。


ちなみに以下はrealtime databaseのキャパシティです。

1つのデータベースで、約100,000件の同時接続と、毎秒1,000回の書き込みまでスケールできます。

これを超えると無料枠では対応できなくなりますし、課金制であればその分料金割増になります。

そのため、基本は.once()で同期処理は走らないようにしておけばいい、ということです。

.off()

ある期間だけは.onにしたいけど、ある一定時間たてば同期は不要という場合は.off()を使います。

const sampleRef = firebase.database().ref('sample')
sampleRef.on('value', function(snapshot){
	console.log('value', snapshot.val())
})


ある一定時間たったときに.off()を実行します。

sampleRef.off()

まとめ

firebaseは公式ドキュが丁寧なので最高です。

こんなクソ記事読まずに公式ドキュ読みましょう笑

以上、終わり!