2016-01-20 20 views
7

我試圖通過將Google App Engine請求處理程序拆分爲多批實體並運行併發goroutines以發送較小的PutMulti調用(每個100個實體)來加速Google App Engine請求處理程序的大數據存儲區PutMulti調用(500個實體)。appengine數據存儲超時錯誤5和11有什麼區別?

在此之前,當我在許多併發請求上測試處理程序時,我經常從我的PutMulti調用中調用數據存儲區錯誤Call error 11: Deadline exceeded (timeout)。並行化後,處理程序確實加快了速度,但我偶爾也會遇到該錯誤以及另一種類型的錯誤,即API error 5 (datastore_v3: TIMEOUT): The datastore operation timed out, or the data was temporarily unavailable

由於數據存儲中的爭用而導致此錯誤5,錯誤5和錯誤11之間有什麼區別?

+2

您看到的第一個錯誤可能只是正常操作中的超時,第二個錯誤可能是因爲寫入爭用。更多相關信息:[處理數據存儲錯誤](https://cloud.google.com/appengine/articles/handling_datastore_errors) – icza

+0

謝謝!保持真棒! –

回答

1

這些錯誤來自兩個不同的地方,第一個是調用錯誤,是由RPC客戶端中的超時導致的本地錯誤。它表示有一個等待RPC完成的超時。 google.golang.org/appengine中的默認RPC超時時間爲60秒。

第二個錯誤來自服務端。此錯誤表示在數據存儲區內執行操作時發生超時。其中一些操作的超時時間比60s短得多,通常這可能表明存在爭用。

理解差異的一種可能更簡單的方法是,您會發現如果您通過大量更改進行單個多操作,則可以輕鬆觸發第一個超時。如果您針對單個按鍵或一小組按鍵創建了大量併發操作,則您將更容易觸發後者。由於超時是共享資源飽和的一般指標,因此當然有許多方法和組合來生成它們。通常,人們會希望適當地重試操作,並且適當地調整操作的大小,並且儘可能地聚合熱鍵上的操作以減少與爭用相關的問題的可能性。正如其他人所建議的,python和java文檔已經有一些例子。

您可能希望使用https://godoc.org/google.golang.org/appengine#IsTimeoutError,如果您需要增加第一個錯誤類的超時時間,則可以調整上下文截止時間,請參閱此處的方法:https://godoc.org/golang.org/x/net/context#WithDeadline注意:您將無法將期限延長到請求截止日期之後,但是,如果您在任務或虛擬機中運行,則可以延長到最後期限。

相關問題