1

documentation for GAE's Task Queue API狀態:任務隊列,冪等,和物化交易

你可以排隊一個任務作爲數據存儲區事務的一部分,使得任務只排隊,並保證被排隊,如果交易承諾成功。

然而,documentation for datastore transactions美國的兩倍,我們應該讓他們冪等只要有可能,並提交給任務隊列不冪等。 documentation for objectify更進一步,在其交易中解釋了work MUST be idempotent

那麼,有沒有處理結合這些建議/要求的標準方式,或者我應該推出自己的技術(可能使用類似this)?

+0

我不確定你在哪裏發現這裏的矛盾。如果你在一個事務中,那麼這個任務是事務性的添加的,所以如果事務失敗,任務不會被排隊。 –

+0

@DanielRoseman原因交易建議/要求是冪等都是這樣的情況:交易拋出一個'DatastoreFailureException',但隨後反正成功,所以任務排隊。 Objectify重試交易,並且它再次成功。現在你的任務已經排隊兩次了,因爲排隊任務不是冪等的。 –

回答

2

還有一個任務可以執行兩次(或更多)的關注 - 隊列提供了「至少一次」的語義而不是「只有一次」的語義。這很常見。

有些操作是很容易的冪(例如,「設置生日」)。有些操作可能難以實現冪等性(例如,「從賬戶A向賬戶B轉移$ 5」)。對於困難的人來說,通常這個技巧涉及在事務序列開始之外創建一個事務ID,並確保該ID遵循整個鏈,甚至通過任務。如果有任何重試並且看到交易ID已經完成,您可以返回。

+0

哦 - 看起來Task Queue文檔的一部分並沒有貼在我身上。謝謝你指出!所以,答案是我必須讓這些任務本身是冪等的,所以排隊兩次是沒有問題的!非常感謝。 –

1

如果任務排隊比什麼都在它的關聯交易其他承諾爲好。是的,從技術上講,事務有可能被提交併仍然會得到錯誤響應(例如超時接受成功響應),儘管這不常見。無論如何,你的任務也應該是冪等的(它可以在自己的事務中使用承諾的數據來提供幫助),因爲即使你提交了一次任務也可以多次執行。見Why Google App Engine Tasks can spuriously be executed more than once?