2016-07-25 51 views
1

我正在嘗試創建約100,000個具有相同父級的新實體(代表用戶)。我讀過每個實體組每秒寫入一個實體的限制。我認爲這個請求可能會超時,所以我決定使用推送隊列任務來延長我需要十分鐘的時間。我嘗試在推送隊列任務的for循環中使用put(),但最終仍然超時(只能編寫大約8,900個實體)。Google數據存儲 - 當您超出每秒一次寫入限制時會發生什麼?

我很困惑,爲什麼我沒有得到一個錯誤,因爲我試圖對同一組進行多次寫入。任務超時10分鐘,這意味着我每分鐘寫入890個寫入,每秒寫入約14個寫入。這是每秒寫一次的方式..我讀了Google App Engine HRD - what if I exceed the 1 write per second limit for writing to the entity group?Google Datastore - Not Seeing 1 Write per Second per Entity Group Limitation的答案,但據我的理解,它只是說,數據存儲可能每秒寫入5-10個實體。我得到的比率比那要高。

我也讀here,當以單一實體或實體組被太快更新發生

數據存儲區的爭用。數據存儲將排隊併發請求以等待輪到。請求在隊列中等待超時時間將拋出併發異常

這是否意味着錯誤不會超過1寫/秒?寫入操作只會被放入隊列中,並且在發生請求超時時(這種情況下,任務隊列爲10分鐘),我只會收到一個錯誤?

+0

你會得到爭用,1/s是保證限制。如果不查看代碼,則無法分辨更多細節 – marcadian

回答

3
  1. 對具有自動縮放的實例運行的任務有10分鐘的限制。您可以將100,000個用戶分成更小的批次,並在單獨的任務中處理每個批次。

  2. 您可以使用對數據存儲的批量調用,在一次調用中最多可以保存500個實體,這比單獨保存每個實體快得多。

  3. 絕對沒有理由讓所有用戶都在同一個實體組中。這個數據模型會帶來負面的性能影響 - 寫入限制是有原因的。實體組被設計爲具有3個地址或10個相冊的用戶,即使這樣,我幾乎總是避免親子關係,因爲他們很少添加任何值,但使代碼更復雜(您始終必須知道父代檢索或保存實體)。

相關問題