2014-12-30 100 views
3

GAE的文檔ndp.put_multi嚴重缺乏。 NDB Entities and Keys - Python — Google Cloud Platform顯示它返回一個鍵列表(list_of_keys = ndb.put_multi(list_of_entities)),但它沒有提到失敗。 NDB Functions不提供更多信息。如何處理來自ndb.put_multi的錯誤

通過代碼(下)洞穴探險,我表明,至少在目前,put_multi只是集合了Future.get_result()■從異步方法,它本身代表的實體put代碼返回。現在,docs for the NDB Future Class表示將返回結果,否則將引發異常。然而,我被告知,如果一個特定的put失敗,結果將是None(我找不到任何權威的文檔來說明這個效果,但是如果它是類似於db.get那麼這將是有意義的)。

the code

所以這一切歸結爲一些問題我無法找到答案:

  1. 顯然,返回值是一個列表 - 它是一些元素的列表可能沒有?或者是使用例外嗎?
  2. 當出現錯誤時,應該重新放置什麼?所有實體是可以重新投入(冪等)還是隻有那些返回值爲None(如果這甚至是如何傳遞錯誤)?
  3. 錯誤常見(一個答案:1/3000)?他們是否出現在日誌中(因爲我沒有見過)?有沒有辦法可靠地模擬測試錯誤?

Usage of the function in an open source library意味着該操作是冪等的,但就是這樣。 (Other usages don't even bother checking the return value or catching exceptions。)

Handling Datastore Errors除了例外情況外沒有提到任何內容。

回答

3

我同意您讀下面的代碼:put_multi()put_async().get_result()有同樣的錯誤反應。如果put()會引發異常,那麼put_multi()也會並且將無助於多個呼叫中的哪一個失敗。我不知道put_multi()將返回None的情況下的密鑰列表中的一些條目。

假設在上次投入嘗試後沒有其他用戶更新過這些實體,您可以重新放置已放置的實體。使用系統生成的ID創建的實體會更新其內存中的鍵,因此重新設置它們將覆蓋現有實體,而不會創建新實體。我不會稱之爲冪等的,因爲重試會覆蓋對其他進程創建的實體的任何更新。當然,如果您需要對結果進行更多的控制,您可以在事務中執行此更新,但所有實體都需要位於同一個實體組中,以便與原始事務一起工作。 (跨組事務最多支持五個不同的實體組)。如果任何嘗試失敗,則在事務過程中失敗將確保沒有任何實體被創建或更新。

我不知道更新失敗的一般錯誤率。這類故障很可能包括爭用錯誤或「熱點片劑」(太短時間內對附近記錄的更新太多,導致超時),這將取決於應用行爲。所有這些錯誤都被API報告爲例外。

測試錯誤處理調用路徑的最簡單方法是包裝Model類並覆蓋具有測試模式行爲的方法。您可能會更加喜歡並深入到testbed使用的存根API,這可能有辦法掛鉤到低級調用並模擬錯誤。 (我不認爲這是testbed的特徵,但可以使用類似的技術。)