2017-12-20 10 views
0

ネットワーク接続が失われ再確立された場合に、firebaseモバイルクライアントがサーバからダウンロードするデータを正確にどのくらい知っているかに関する知識を誰かが共有できますか?firebaseクライアントはどのデータを同期させるのですか?

だがそれを言ってみましょう:

  • キーKEY1とKEY3と、データベース内のオブジェクトがありました。
  • モバイルクライアントがダウンロードしてオフラインになりました。
  • その間にkey2とkey4が追加されました
  • クライアントは接続を復元し、何とかkey2とkey4を受け取ります。

何が変更されたかは正確に分かりますか?

  • コレクション全体を再度ダウンロードしますか?
  • 何とかすべてのオブジェクトのキーを交換して欠けているものを比較していますか?
  • サーバは、どのクライアントに何があるかを記憶していますか?
  • 他に何か?
+0

※ダウンロードしたことはありますか?つまりノードを1回観測すると(observeSingleEvent)、それらをダウンロードすると、クライアントはオンラインであったとしても変更について知りません。同様に、削除をノードで監視していて2人の子供が追加された場合、再びオンラインであってもアプリに通知されません。 – Jay

答えて

1

サーバーは各クライアントのアクティブなリスナーを追跡しますが、各クライアントが認識しているものは追跡しません。

代わりに、ローカルキャッシュにある場所にリスナーを接続すると、クライアントはキャッシュデータのすべてのブランチの合成ハッシュキーを計算します。これらのハッシュをサーバーに送信します。サーバーは実際のデータに対して同じハッシュを実行します。いずれかのハッシュが異なる場合、データが変更され、サーバーからクライアントに送り返されます。


このハッシュ/交換が唯一あなたがキャッシュされ、にリスナーを添付したデータのために起こることに注意してください。リッスンしていないキャッシュデータはこの処理を行いません。通常、アプリの生涯にわたってデータのさまざまな部分にリスナーを追加するため、このハッシュと同期のコストはアプリの生涯にわたって広がります。あまり慈愛のない行動を見たのは、デベロッパーがデータベースのルートにkeepSynced(true)という名前を付けた場所だけです。アプリの起動時に本質的に「巨大な同期」が強制されます。このシナリオでは、ローカルキャッシュのハッシングとその同期化は、些細な時間、メモリ、および帯域幅を消費する可能性があります。

関連する問題