2016-02-28 59 views
0

我在我的應用程序中有一個計數器,我期望有99%的時間在使用事務更新計數器時不會出現爭用問題。GAE/P:爲計數​​器使用延遲任務和事務

要處理1%的時候很熱鬧,我是通過使用交易延期任務中的思維更新計數器如下:

def update_counter(my_key): 
    deferred.defer(update_counter_transaction) 

@ndb.transactional 
def update_counter_transaction(my_key): 
    x = my_key.get() 
    x.n += 1 
    x.put() 

偶爾的情況下,當競爭導致交易失敗,任務將被重試。

我熟悉分片計數器,但這看起來更容易,適合我的情況。

有什麼我錯過,可能會導致此解決方案無法正常工作?

回答

1

自動任務重試可能存在問題,至少在理論上可能會出於以外的原因預期計數器增量的交易排序。如果這種不需要的重試成功地重新執行計數器遞增編碼,計數器值可能會被丟棄(將高於預期值)。其中可能可能不是可以接受您的應用程序,具體取決於使用計數器。

這裏是不需要的延遲執行任務的調用的例子:GAE deferred task retried due to "instance unavailable" despite having already succeeded

的這個問題的答案與本說明定期任務隊列documentation似乎內嵌(我沒有看到這樣的音符the deferred task queues article,但我將其標記爲可能我腦):

請注意,任務名稱不提供絕對保證一次只有 語義。在極其罕見的情況下,多次調用創建相同名稱的 任務可能會成功,但在此情況下,將只執行其中一個任務 。在例外的情況下, 可以運行多次。

從這個前瞻性它可能實際上是更好地保持計數器與相關的邏輯/事務操作的其餘部分(如果有的話),而不是孤立它作爲一個任務隊列中的單獨的事務一起遞增。

+0

謝謝,對於我的應用程序來說,計數器並不確切,所以我不介意這種情況比較罕見。 –