Firebase DBで、遅延解消のために無理やりホストサーバーとの同期をさせる。

今現在、八丈島のホテルで伝票システムアプリ(注文を選ぶ→計算→レシート印刷)を1人で作っています。

 

そのアプリ制作に関する話は今度Qiitaにでも上げたいと思ってますが、今回はその制作中のなかでの Firebase Realtime Databaseに関する課題解決についての話です。

 

 

 

※環境

  • PC OS -------- Windows
  • IDE ------ Android Studio (version 3.4)
  • Firebase Realtime Database ------ (16.10)
  • Kotlin (1.3.21)

 

結論

ドキュメントではわかりづらいが、

goOffline()メソッドを呼んで, → goOnline()メソッドを呼ぶと同期が瞬時に行われる。

 

 

 

アプリの説明

まず簡単に作ってるアプリの説明をします。

 

f:id:ajfrlc9808:20190518110035p:plain

伝票システムアプリの図

 

以上です。

 

 

・・・ってのは冗談ですが、ほぼこの図で説明はついていると思います。

まず10人ほどいるホテルスタッフがタブレット(Fire 7)をポケットに入れておいて、お客様が注文を頼むときは、その端末から注文を取ります。

そして、Firebase のDB内でそのお客様の情報(テーブルと部屋番号)に注文情報が紐づけられます。

そのDBへの記入(変更)をバーカウンターに置いてある端末(Fire HD10)がキャッチして、隣のサーマルプリンターにBluetooth経由で情報を送信してレシートを印刷します。

 

そしてバーカウンターにいる他のスタッフ(あるいは注文をとったスタッフ)がそのレシートに書かれてある商品を作ります。

 

(結局長くなった。。。)

 

遅延がでてくる!

前置きが長くなりましたが、

割と初期の段階から問題が色々でてきて、その内の2台巨頭の1つが、

スタッフの端末(Fire 7)で書き込まれた情報が、なかなかホストのDBに書き込まれない。 (つまりクライアントとホストの同期が遅い。)

  という問題でした。

 

 

結果的に、注文とる → レシート印刷 までに遅延が発生していました。

毎回遅延するという訳ではなく、10分の1(10%)ぐらいで発生しており、時間にすると1回の遅延で1分~2,3分遅れ、とても無視できる遅延時間ではありませんでした。

(※Wifiの接続が一瞬でも途切れると、遅延はほぼ発生。)

 

最初は端末(Fire7)の問題かな~、これ安いしな~とか思ったけど、色々Logを取ったり調べていくと、どうもそうではないらしい。

Wifiの問題かな~、中継器でも買って様子見ようかな~とも思ったけど、それも違うっぽい。

 

最初からGoogleの方(Firebaseの方)には問題なんかないだろうと思っていたけど消去法的にそれしかなくなりました。

 

原因

それでFirebase Realtime Databseを色々調べたりしたんですが、原因はまだわかってません。

StackOverflowにも書いて無く、MENTAやCodeMentorなどを使って、聞いてみたがわからず。。

Wifi接続が一瞬でも切れるとそこから数分はオフラインモード(ローカルのDBに書き込み)になるのかもしれない

 

もし、なにか意見があれば教えてください!

 

 

対策

原因はわかんないけど、対策はわかりました!

上の結論でも書いたけど、goOffline()メソッド → goOnline()メソッドを連続で呼ぶことで、ホストサーバーとの同期がすぐに始まりました。

 

リファレンス内でこのメソッドを見つけるのに、ちょっと苦労しました。

ここです)

 

 

なので対策としては、

  1. Broadcast ReceiverでWifi接続を監視して、オフラインになったらgoOffline()、オンラインに復帰したらgoOnline()を呼ぶ。
  2. DBに書き込む前後(どちらかか両方でも)で2つのメソッドを連続で呼ぶ。

になると思います。

この対策コードを書いてからは、今のところ(5/8~)は遅延がないです。

 

 

 

原因は調査中ですが、なにか思うとこがあれば気軽に書いてください!どんな意見でも大歓迎です!

わかったら追記します!(あと遅延が再発しても追記。。。)