我對StackOverflow比較陌生,不確定它是否適合提問設計問題。網站給我一個提示「你問的問題看起來很主觀,很可能會被關閉」。也許應該詢問programmers.stackexchange.com。請告訴我。如何平衡Google App Engine的多個* dynamic *後端實例的負載?
無論如何..我正在進行的項目之一是在線調查引擎。這是我在GAE上的第一個大型商業項目。
我需要你的建議,以便如何收集統計數據並有效地將它們記錄在DataStore中而不會破壞我的數據。最初的要求是:
- 用戶完成調查後,客戶端發送對[ID(int)+ PercentHit(double)]列表。此列表顯示此用戶的答案與參考答覆者(由ID標識)的預定義答案的匹配程度。我稱他們爲「目標ID」。
- 調查的創建者希望查看上個小時,特定時間範圍或調查開始時給定ID的總計百分比。
- 一些調查可能有成千上萬的目標/參考答覆者。
所以我創建的實體
public class HitsStatsDO implements Serializable
{
@Id
transient private Long id;
transient private Long version = (long) 0;
transient private Long startDate;
@Parent transient private Key parent; // fake parent which contains target id
@Transient int targetId;
private double avgPercent;
private long hitCount;
}
但是從每個用戶爲每個目標寫HitsStatsDO將使大量的數據。例如,我對3000個目標進行了調查,一週內有400萬人回答,第一天有30萬人參與調查。即使我們假設他們均勻地回答了24小時,它也會給我們~1040個寫/秒。顯然,它達到了Datastore的併發寫入限制。
我決定收集一小時的數據,除此之外,這就是爲什麼avgPercent
和hitCount
在HitsStatsDO
。 GAE實例是無狀態的,因此我必須使用dynamic backend instance。
在那裏,我有這樣的事情:
// Contains stats for one hour
private class Shard
{
ReadWriteLock lock = new ReentrantReadWriteLock();
Map<Integer, HitsStatsDO> map = new HashMap<Integer, HitsStatsDO>(); // Key is target ID
public void saveToDatastore();
public void updateStats(Long startDate, Map<Integer, Double> hits);
}
,並與碎片對當前小時和前一小時(不留在這裏長期)
private HashMap<Long, Shard> shards = new HashMap<Long, Shard>(); // Key is HitsStatsDO.startDate
所以每小時一次我映射將前一小時的碎片轉儲到數據存儲。
另外我還有class LifetimeStats
它將Map<Integer, HitsStatsDO>
保留在memcached中,其中map-key是目標ID。
同樣在我的backend shutdown hook method我將未完成小時的狀態轉儲到數據存儲。
只有一個在這裏主要的問題 - 我只有一個後端實例 :)它提出了以下關於這一點我想聽聽你的意見的問題:在不使用後端
- 我能做到這一點實例?
- 如果一個實例不夠,該怎麼辦?
- 如何在多個動態後端實例之間拆分數據?這很難,因爲我不知道我有多少人,因爲隨着負載的增加Google會創建新的。
- 我知道我可以啓動居民後端實例的確切數量。但有多少? 2,5,10?如果我一週沒有任何負擔,該怎麼辦?不斷運行10個後端實例太昂貴了。
- 在後端實例死機/重新啓動時,如何處理來自客戶端的數據?
有一點要注意的是我不能更改客戶端。目前,JavaScript嵌入到客戶的網頁中。我可以通過某種方式更改RPC,但在體系結構上,我無法用Google文檔格式替換客戶端。
非常感謝你的想法。
謝謝您的反饋!不幸的是,我無法徹底改變客戶。我應該在原帖中提及它。我更新了它。再次感謝! – expert
文檔格式不會擴展到一百萬個受訪者。 –
「文檔表單不會擴展到一百萬個受訪者」 - Google說的是什麼?像谷歌博客頁面不會擴展到一百萬讀者?請記住,匿名無法擊敗亞馬遜。會有一百萬用戶關閉一個谷歌頁面嗎? –