2014-02-21 38 views
1

我試圖設計一個應用程序,它使用Google AppEngine存儲/處理/查詢數據,然後通過Cloud Endpoints API將數據提供給移動設備儘可能的時間。AppEngine實時查詢 - 成本,性能,延遲平衡操作和配額

這是直截了當的解決方案,但我正努力在AppEngine上獲得性能,成本和延遲之間的正確平衡。

情景(類比)是用戶檢入(每天從不同地點,城市,國家進行多次檢查),我們希望允許用戶通過設備查詢所有數據並提供最新的信息儘可能。

  • 如:
    • 簽入在過去數:
    • 24小時
    • 1周
    • 1個月
    • 所有時間
    • 哪裏最在相同時間段內在地點/城市/國家/地區檢查
    • 哪裏檢查得最少發生在同一時間段
    • 其他類似查詢報告

我們可以使用內存緩存來存儲最近簽入,推到數​​據存儲,每5分鐘,但是這可能不會規模非常好,是不健壯! 使用Cron作業運行Task Queue/Map Reduce以獲取每30分鐘每個位置的聚合,平均值並更新數據存儲。

面臨的挑戰是對數據存儲使用盡可能少的讀/寫操作,因爲最後的「24小時」數據每5分鐘更改一次,因此最後一週的數據,上個月的數據等也是如此。數據在某種程度上必須是動態的,所以它不是固定的時間點,它們總是在變化 - 這是問題所在!

設置它並不是一個問題,而是要高效地設置它,平衡用戶的性能/延遲和我們的成本/配額並非易事!

簡單的解決方案是使用SQL,並運行日期範圍查詢,但這不會很好地擴展。

我們最終可以使用BigTable & BigQuery進行「所有時間」查詢,但爲了在其他時間段通過API爲用戶提供儘可能實時的數據,這是相當大的挑戰!

任何關於AppEngine架構/方法的建議都將受到嚴肅的歡迎。

非常感謝。

回答

0

Push Queue比添加新簽入的Memcache更健壯。 Memcacheget_entity_group_version(key)一起減少了讀取量。

從用戶歷史記錄中提前統計每日,每週,每月和每年維度的統計數據(例如最多和最不常用的位置)以減少查詢記錄數(與分析數據庫相同)。設計您的實時查詢,以便將過去存儲的彙總數據與尚未彙總的少量當前數據合併。

+0

非常感謝Martin提供的建議和鏈接,非常感謝,有一些好的觀點,會看進入他們。 – user965612

0

首先,寫入數據存儲需要幾毫秒。當用戶點擊刷新按鈕(或提供的任何內容)時,數據將按照「實時」顯示。

通常情況下,當存在同步/擁塞問題時,開發人員會關心實時情況,即每個用戶都可以更新某些內容(例如對某個項目進行出價),並且所有用戶都必須獲得相同的數據(出價最高)實時。在你的情況下,如果用戶獲得1秒鐘的簽入次數,會有什麼危害?

其次,Memcache中的數據可能隨時丟失。在您建議的解決方案中(每5分鐘更新一次數據存儲),您可能會丟失5分鐘內的所有數據。

我寧願在相反的方向使用Memcache:從數據存儲中讀取數據,將其置於Memcache中,使用60秒(或更多)到期,爲Memcache中的所有用戶提供服務,然後進行刷新。這將最大限度地減少您的閱讀當然,我會這樣做,除非用戶必須知道在最近60秒內發生了多少次檢查。

真正的問題是你如何建模你的數據來優化寫入。如果您不想丟失數據,則必須在數據存儲區中記錄每次簽入。您可以通過確保您沒有不必要的索引字段,從其他字段中分離出經常更新的字段等方式進行保存。

+0

嗨安德烈,感謝您的反饋,你提出了一些好的觀點,並傾向於同意你的大部分觀點 - 你會怎樣看待將文本文件推送到帶有全局數據的用戶設備,所以當他們詢問事情的一面,他們通過他們的設備進行數字處理?然後我們每隔30分鐘推送一個新的更新文件 - 與實時方法非常不同 - 但只是一個想法 - 它是愚蠢的嗎? – user965612

+0

我不確定這種方法的可擴展性如何。隨着數據量的增長,文件大小將會增長,處理時間將呈指數增長。通過數據存儲區,您可以保證性能。 –

+0

公平點安德烈,謝謝你。 – user965612