2017-04-10 61 views
4

2週間前にMyPetrolと呼ばれるアンドロイドアプリを公開しました.3日以内にマレーシアの約90,000人のユーザーにヒットしました。その後、私はFirebase Databaseの巨大な帯域幅の消費(3日間で117ギガバイト)のためにこのアプリをダウンしました。私はIT関連のバックグラウンドから来ていない独学の愛好家だから、これで本当に困っています。誰かが助けることを願っています。Firebaseデータベース帯域幅の計算

アプリはガソリン価格の群衆調達アプリです。ユーザーは特定の駅でガソリンの価格を入力することができ、記載された価格に同意する他のユーザーはそれを好きにすることができます。価格が更新されると、「好き」のカウントがリセットされます。

アプリを開くと、近くのガソリンスタンド(最大20ステーション)をGoogle Places APIウェブサービスに問い合わせます。これにより、Firebase Database内のステーションのデータにリスナーがフックされます。各局のデータ構造は次のようになります。

prices{ 
    ChIJpXJ4phI4zDERJqFTBzawpXk={ 
     placeID='ChIJpXJ4phI4zDERJqFTBzawpXk', 
     company=500, 
     lat=3.2095573, 
     lng=101.7185698, 
     name='Shell Malaysia (Iznora Enterprise)', 
     firebaseID='xxx', 
     userName='xxx', 
     time=1491833181946, 
     ron95=2.0, 
     ron97=1.7, 
     diesel=2.0, 
     isValid=true 
    } 
} 

同類を追跡するために、データのセクションが

likes{ 
    ChIJpXJ4phI4zDERJqFTBzawpXk={ 
     firebaseID1=true, 
     firebaseID2=true, 
     firebaseID3=true 
    } 
} 

としてそこにある私たちは、トラフィックのチェックに(Firebase.getDefaultConfig().setLogLevel(Level.DEBUG))を使用することができますFirebase database bandwidth usage when read with Queryを読んで、私は、アップロードに関して何も表示されませんでしたlogcatの帯域幅をダウンロードしてください。このようなものだけ...

04-10 22:39:19.250 3015-3192/? D/RepoOperation: onDataUpdate: /prices/ChIJpXJ4phI4zDERJqFTBzawpXk 
04-10 22:39:19.250 3015-3192/? D/RepoOperation: onDataUpdate: /prices/ChIJpXJ4phI4zDERJqFTBzawpXk {time=1491833181946, firebaseID=xxx, valid=true, diesel=2, ron97=1.7000000476837158, ron95=2, placeID=ChIJpXJ4phI4zDERJqFTBzawpXk, name=Shell Malaysia (Iznora Enterprise), userName=xxx, company=500, lat=3.2095573, lng=101.7185698} 
04-10 22:39:19.268 3015-3015/? D/EventRaiser: Raising /prices/ChIJpXJ4phI4zDERJqFTBzawpXk: VALUE: {time=1491833181946, firebaseID=xxx, valid=true, diesel=2, ron97=1.7000000476837158, ron95=2, placeID=ChIJpXJ4phI4zDERJqFTBzawpXk, name=Shell Malaysia (Iznora Enterprise), userName=xxx, company=500, lat=3.2095573, lng=101.7185698} 
04-10 22:39:19.273 3015-3015/? D/EventRaiser: Raising /likes/ChIJpXJ4phI4zDERJqFTBzawpXk: VALUE: null 

最後に、Androidデバイスモニタを使用して、各動作のトラフィックを確認しました。以下は、Firebaseのみの平均結果です。 Googleマップや他のhttpクエリは含まれていません。

+----------------------------+-----------+-----------+-----------------------------------------+ 
|   Action   | Rx(bytes) | Tx(bytes) |     Notes     | 
+----------------------------+-----------+-----------+-----------------------------------------+ 
| onPause     |  2942 |  4680 | detach all listeners     | 
| onResume     |  10143 |  5204 | reattach all listeners for 15 stations | 
| click "like" by self  |  620 |  535 | write action + download /likes/placeID | 
| update price by self  |  1642 |  1783 | write action + download /places/placeID | 
| click "like" by other user |  382 |  112 | download /likes/placeID     | 
| update price by other user |  423 |  104 | download /places/placeID    | 
+----------------------------+-----------+-----------+-----------------------------------------+ 

私がアプリケーションをダウンさせる直前に、私はデータベースに5.7MBのデータを持っていました。私は、各駅のリスナーを/ prices/placeIDとして直接接続していることを保証できるので、 "駅"のデータ全体は取得せず、その特定の駅のデータのみを取得しました。同様に、「好き」。リスナーもonPauseから切り離されます。

ユーザーアクションのログがありません。そのため、何が起きたかを追跡することは困難です。しかし、ユーザーがアプリを開くたびにGoogle Place APIにクエリを実行する必要があるので、3日間で245kのクエリがあったことを知っています。したがって、各ユーザセッションに対して。

117GB/245k session = ~480kB/session 

これは巨大に見えます。私は帯域幅などの経験がないので、間違っている可能性があります。すべてのユーザーが以下のような極端な操作を行ったと仮定しても、まだ帯域幅を埋めることはできません。

+----------------------------+-----------+-------+--------------+----------------------------------------------------------+ 
|   Action   | Rx(bytes) | Times | Total(bytes) |       Notes       | 
+----------------------------+-----------+-------+--------------+----------------------------------------------------------+ 
| onPause     |  2942 | 10 |  29420 | Pause and resume 10 times, this does not update the map. | 
| onResume     |  10143 | 10 |  101430 |               | 
| click "like" by self  |  620 | 15 |   9300 | Click like on all 15 stations       | 
| update price by self  |  1642 | 15 |  24630 | Update price on all 15 stations       | 
| click "like" by other user |  382 | 100 |  38200 | 100 other users clicked per session      | 
| update price by other user |  423 | 100 |  42300 | 100 other users updated the price per session   | 
| Total      |   |  |  245280 |               | 
+----------------------------+-----------+-------+--------------+----------------------------------------------------------+ 

通常のユーザのために、私はFirebaseは、帯域幅の10倍の量を消費しているように見えるので、唯一のセッションごとに50KBの最大の周りに持っていることを期待したいです。だから私の質問:

  1. 私はセッションごとの帯域幅の計算の権利をしましたか?
  2. Androidデバイスモニタを使用してトラフィックを判断しましたか?何か不足していますか?確認する良い方法はありますか?
  3. Firebaseはどのように帯域幅を計算しますか?それにはアップロードも含まれていますか?隠れた帯域幅はありますか?

ごめんなさい。誰かが助けることができればと感謝します。 ありがとうございます。

答えて

0

このバグが見つかりました。上記の質問とはまったく無関係ですが、他のユーザーを助けるためにここに文書化しています。まず、自分の質問に答える。

質問(1) - はい。セッションあたりの480kBの推定値はかなり正確です。

質問(2)および(3) - Firebaseが消費する帯域幅は、Androidデバイスモニタで記録された帯域幅よりも小さくする必要があります。私はサポートチームに連絡して、次の返信を受けました。

ダウンロードしたGBは、Firebaseデータベースからクライアントアプリケーションに送信されるデータの量のみを測定します。いくつかのオーバーヘッドを控除し、そのため

、実際の帯域幅は次のようになります。これは、あなたのapplication.Youにデータ検索がより多くの情報については、以下のリンクをチェックしたい場合があります意味しますやや低いです。

5

したがって、高帯域幅の消費に戻ってください。 Firebase DatabaseのQueryと関係があります。私は新しいユーザーがサインアップするときに以下のクエリを持っています。

Query priceQuery = getPricesRef().orderByChild("firebaseID").equalTo(myFirebaseID); 

これは私がそのデータベースの.indexOnを設定しなかったbeause私の悪夢の始まりでした。 Firebaseの公式文書hereを読んでください。 Queryに関する文書は非常に貧弱です。それだけでパフォーマンスがインデックスなし悪くなると述べているが、帯域幅について言及したことがない:上記の文に基づいて

Firebase Documentation

、私の仮定は.indexOnなし、Firebaseへのクエリが返信に時間がかかる場合がありますということでしたFirebaseサーバは検索結果の提供に時間がかかる可能性があるためです。

Firebase database bandwidth usage when read with Queryのように、データベース全体が最初にFirebaseからダウンロードされ、クライアント側でソートされ、クエリされます。私はそれがの意味であると思います。リアルタイムクライアントライブラリは、インデックスを指定せずにアドホッククエリを実行できます。

私のデータベースが拡大するにつれて、pricesデータベース全体をダウンロードすることによって、各ユーザのサインアップがより高い帯域幅を消費し始めます。最終的には、サインアップするだけで約800kBを消費していました。 必ず.indexOnを必ず使用してください!

関連する問題