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の最大の周りに持っていることを期待したいです。だから私の質問:
- 私はセッションごとの帯域幅の計算の権利をしましたか?
- Androidデバイスモニタを使用してトラフィックを判断しましたか?何か不足していますか?確認する良い方法はありますか?
- Firebaseはどのように帯域幅を計算しますか?それにはアップロードも含まれていますか?隠れた帯域幅はありますか?
ごめんなさい。誰かが助けることができればと感謝します。 ありがとうございます。