簡體   English   中英

Google App Engine-您如何處理DatastoreTimeoutException?

[英]Google App Engine - how do you handle a DatastoreTimeoutException?

我已經在Google App Engine上構建了一些東西,可以作為iPhone應用程序的后端。 在該應用程序中,存在通過其API推送到社交網絡的交互。 因此,典型的工作流程是這樣的:

  1. 用戶使用iPhone應用程序執行“某事”
  2. 通過HTTP提醒App Engine應用
  3. App Engine會提醒社交網絡用戶做了“某事”。 如果用戶要檢查其在該網絡上的個人資料,則將顯示其通過該應用程序的活動。 因此,就用戶而言,他們可能所做的工作。
  4. App Engine需要自行進行一些持久性處理,但是嘗試時會引發DatastoreTimeException。 現在,數據處於時髦狀態。

那么解決這個問題的好方法是什么? 從本質上講,我很樂意將其包裝為“事務”,但無法回滾發送到社交網絡的內容。 因此,我在考慮如何處理DatastoreTimeException? 我是否應該將其包裝在try塊中並再試一次? 向用戶顯示錯誤,然后再次嘗試時,“跳過”社交網絡交互以便不會被兩次推出是個更好的主意嗎? 還有別的想法我不在考慮嗎?

http://code.google.com/appengine/docs/java/javadoc/com/google/appengine/api/datastore/DatastoreTimeoutException.html

“當您嘗試放置,獲取或刪除太多實體或具有太多屬性的實體,或者數據存儲區過載或出現問題時,可能會發生這種情況。”

如果您經常看到該異常,我希望這是因為數據存儲區操作太大,因此重試實際上並沒有幫助。 如果您只是針對可能引發異常的風險進行防御性編碼,則可以再次嘗試(也許通過排隊執行此操作的任務。但是,如果您無法訪問數據存儲區,那么您可以將任務?)

如果您希望具有強大的防彈功能,並且可以確保在社交網絡上執行的操作是冪等的(可以重復),則:

  • 記下您自己需要執行社交網絡操作。
  • 如果筆記無法存儲,請中止並返回失敗。
  • 否則,請嘗試社交網絡操作。
  • 如果成功,請刪除注釋。
  • 有某種任務或循環可在將來重試任何剩余的筆記。

當然,您必須謹慎對待返回給iPhone客戶端的響應代碼,因為成功可能需要長時間-比iPhone應用程序發出請求的時間更長。 因此,您也希望您的應用引擎請求也是冪等的,並且您可能想要某種取消。

如果您從社交網絡中獲得的一切都是成功或失敗,並且如果必須重復執行該操作,那么您將遇到麻煩。 這是在Web上提供的垃圾API,因為僅Web服務器向您發送成功的響應並不意味着您已收到響應,因此即使成功產生了責任,調用者有時也無法知道他們已經成功。 但是它發生了。

我覺得這句話令人擔憂: 在實踐中,重試通常是成功的。 您會定期獲得數據存儲超時,即使是小型操作也是如此。 – Wooble 1月23日14:59

如果GAE存在可靠性問題,該如何認真對待? 通常,您發現數據存儲緩慢嗎? 您對這些例外發生頻率的估計是多少?

這是任何分布式系統的基本問題。 通常,沒有簡單的“防彈”解決方案。 如果可能的話,最好的選擇是確保一個或兩個操作是冪等的-也就是說,多次執行它們不會產生任何效果。 對於數據存儲,這非常簡單:如果您指定鍵名,則多個put都將相互覆蓋。 如果可能的話,您也應該在社交API中利用冪等性,以便在失敗的情況下可以安全地重新執行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM