2017-04-10 100 views
4

我已在2周前發佈了一個名爲MyPetrol的Android應用程序,並在三天內在馬來西亞大約有9萬用戶。之後,由於Firebase數據庫帶寬消耗巨大(3天117GB),我放棄了該應用。我是一名自學成才的業餘愛好者,他不是來自IT相關背景,所以我非常擔心這一點。希望有人能幫忙。Firebase數據庫帶寬計算

該應用程序是一個汽油價格的衆包應用程序。用戶可以在特定車站輸入汽油的價格,並且同意所述價格的其他用戶可以「喜歡」它。一旦價格更新,「類似」計數將被重置。

打開應用程序後,它會查詢附近加油站的Google Places API Web服務(最多20個工作站)。因此,它會將聽衆與Firebase數據庫中的電臺數據掛鉤。每個站的數據結構如下所示。

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 database bandwidth usage when read with Query,我們可以使用(Firebase.getDefaultConfig().setLogLevel(Level.DEBUG))交通檢查,但我沒有看到有關上傳任何東西並在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的平均結果。谷歌地圖和其他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 |               | 
+----------------------------+-----------+-------+--------------+----------------------------------------------------------+ 

對於一個普通用戶,我希望只有50KB左右最高每會話,因此火力地堡似乎是消耗帶寬的X10量。所以我的問題:

  1. 我有做每個會話帶寬的計算權嗎?
  2. 使用Android設備監視器確定的流量是否正確?我錯過了什麼嗎?有沒有更好的方法來檢查?
  3. Firebase如何計算帶寬?它是否也包含上傳?有沒有隱藏的帶寬?

對不起,很長的文章。感謝有人能幫助。 謝謝。

回答

0

我發現了這個bug。它與上述問題完全無關,但我在此處記錄它以幫助其他用戶。首先,回答我自己的問題。

問題(1) - 是的。估計每個會話480kB應該是相當準確的。問題(2)和(3) - Firebase消耗的帶寬應低於Android設備監視器記錄的帶寬。我聯繫了支持團隊,並得到了以下答覆。

對於帶寬問題,下載的GB僅衡量Firebase數據庫向您的客戶端應用發送的數據量。這意味着數據檢索到您的application.You可能要檢查以下鏈接瞭解更多信息:

因此,扣除一些開銷,實際帶寬要略低。

5

那麼,回到高帶寬消耗。它與Firebase數據庫的Query有關。新用戶註冊時,以下有一個查詢。

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

這是我噩夢的開始beause我沒有設置.indexOn該數據庫。閱讀官方的Firebase文檔here。有關Query的文檔非常差。它只是說性能將沒有指數不佳,但從來沒有提及任何關於帶寬:

Firebase Documentation

基於上面的說法,我的假設是,沒有.indexOn,查詢到火力地堡可能需要更長的時間來回復,因爲Firebase服務器可能需要更長時間才能提供搜索結果。

然而,在Firebase database bandwidth usage when read with Query回答,整個數據庫首先從火力地堡下載,然後進行排序,並詢問有關客戶的身邊!我想這就是他們的意思實時客戶端庫可以執行臨時查詢而不指定索引

隨着數據庫的增長,每個用戶註冊開始通過下載整個prices數據庫消耗更高的帶寬。最終,每個用戶只需註冊約800kB。 所以一定要使用.indexOn