2012-03-17 56 views
1

我想模擬一個簡單的圖表編輯器,它將數據存儲到GAE的HRD數據存儲中,並且我遇到了問題,我想知道您是否可以給我一些建議。基本上,編輯器的型號是:Google AppEngine HRD - 一致性與爭用?

[圖] --contains - > [形狀] - 包含 - > [文字]

起初,我把這些成相同的實體組,以確保數據是一致的。通過這樣做,無論何時添加新形狀或將文本對象添加到現有形狀,它們都會正確顯示(因爲它是從數據存儲中查詢的)。但是,我遇到了問題,因爲用戶可能會快速添加許多形狀,並且會導致每秒更新一次圖表對象,從而導致寫入爭用。

或者,我可以設計像這樣:

[圖表] [形狀 - 包含diagramId] [文字 - 包含shapeId]

這使他們不同的實體組中,當我創建一個新的形狀我只需要保存形狀對象本身。這解決了寫爭用問題,但數據不再一致 - 取決於HRD提交寫入的時間,我可能會得到過時的數據。

我嘗試了一些組合,例如將圖放入緩存中,並且僅當緩存不包含圖時才從HRD中檢索;然而,這是不可預知的,因爲我不能確定圖表會在緩存中(我預計很多圖表會同時被編輯)...

處理此類問題的最佳做法是什麼?我使用Java和JDO,如果說有什麼區別...

回答

1

幾點注意事項:

  1. HRD讀,如果你使用get,如果你使用query最終一致(如查詢,依靠強烈一致索引和那些需要時間來建立)。如果可能,您可以使用get來解決您的問題。

  2. 如果文本和形狀是一個圖的一部分,並且您不需要單獨訪問它們,並且您不需要通過Text或Shape的屬性進行搜索,那麼您可以在圖的內部序列化文本和圖形。我使用Objectify,這隻需要在字段上註釋@Serialize即可(不知道JDO,因爲我不使用它)。

+0

+1提到物化 - @adrian,我會敦促你考慮放棄JDO並轉向物化。它會以一致的方式爲你處理memcaching。 – Stefan 2012-03-18 10:12:51