2012-02-13 16 views
5

我有一個長時間運行的作業,可以更新1000個實體組。之後我想開始第二份工作,而且必須假設所有這些項目都已更新。由於實體組有很多,所以我不能在事務中這樣做,所以我剛安排第二個作業在第一個完成使用任務隊列後15分鐘運行。如何知道Google AppEngine HRD數據存儲的更新何時完成?

有沒有更好的方法?

假設15分鐘可以承諾數據存儲與我以前的調用保持同步,是否安全?

我正在使用高複製。

在關於HRD的Google IO視頻中,他們列出了處理最終一致性的方法。其中之一是「接受它」。一些更新(如twitter帖子)不需要與下一次閱讀一致。但他們也說過這樣的話:「嘿,我們只是在幾秒鐘之前說話毫秒,然後才能保持一致」。那個時間框架記錄在其他地方嗎?假如在再次閱讀之前等待寫一分鐘後等待是否安全,這意味着所有我的優先寫作都在閱讀中?

的該一提的是在39:30它標記在這個視頻http://www.youtube.com/watch?feature=player_embedded&v=xO015C3R6dw

+0

我已經在下面給出了部分答案,但是您能否提供有關您正在嘗試做什麼的更多信息? – mjaggard 2012-02-13 13:33:40

+0

基本上我插入或更新1000個實體。當這項工作完成後,我需要對這些項目進行排名。所以我運行一個查詢來選擇所有的記錄,並按照我關心排名的字段排序。然後我更新另一個實體類型的等級。如果實體在查詢中缺失,那麼排名顯然會消失。 – user963263 2012-02-14 04:25:18

回答

0

我不認爲有任何內置的方式,以確定是否更新完成。我建議給你的實體添加一個lastUpdated字段,並用你的第一份工作更新它,然後在運行之前檢查你正在更新的實體的時間戳...有點破解,但它應該工作。

有興趣看看有沒有人有更好的解決方案。有點希望他們這樣做;-)

0

這是自動的,只要你得到的實體沒有改變一致性最終。 HRD在返回之前將數據提供給大多數相關的數據存儲服務器。如果您正在調用put的異步版本,那麼在確定它已完成之前,您需要調用get所有Future對象。

如果您要查詢第一份工作中的項目,則無法確定索引是否已更新。

因此,例如...

如果你在每一個實體更新屬性(但不產生任何實體),然後檢索該類型的所有實體。您可以執行按鍵查詢,然後執行批量獲取(與進行常規查詢相比,速度差不多/便宜),並確保已應用所有更新。另一方面,如果要在第一個進程中添加新實體或更新第二個進程查詢的屬性,則無法確定。

+0

我的第一個進程同時更新並創建新的實體。因此,無論我等待執行第二個進程多長時間(15分鐘),都無法確定實體將立即存在於數據存儲中的相同項目中或15天)? – user963263 2012-02-13 23:00:14

+0

這取決於你的意思是「讀」 - 如果你的意思是「得到」,那麼是的,他們將永遠在那裏。但是,如果你的意思是「查詢」或「找到」,那麼沒有。但是,您可以爲已添加的每個實體執行僅鍵查詢 - 只允許在查詢結果中存在每個添加的實體後執行第二個進程。 – mjaggard 2012-02-14 13:46:55

+0

你的意思是堅持或更新1000的項目,並保存在內存中的密鑰。然後,當我通過查詢讀取它們時,確保所有鍵都存在於結果中?如果它們存在,數據是否保證與幾秒前的更新同步? 即使這是一個有效的方法,在某些時候,我的1,000將會變成1,000,000,我想遠離將這麼多數據保存在內存中。現在,我通過使用遊標來避免這種情況,並且只能同時對幾百個項目進行操作。 – user963263 2012-02-15 02:37:24

相關問題