2013-04-25 22 views
1

我必須在一次交易中增加三個不同的計數器。除此之外,我還必須操縱其他三個實體。我得到單個交易中許多不同的分片計數器

too many entity groups in a single transaction 

我用https://developers.google.com/appengine/articles/sharding_counters的recipie來實現我的計數器。我根據業務邏輯在一些模型(類)方法中增加計數器。

作爲解決方法,我實現了使用任務更新計數器的延遲增量方法。但是,如果計數器的數量進一步增加,那麼這並不能很好地擴展,因爲單個交易中的任務數量有限(我認爲它是5),我想這不是最有效的方法。

我還發現https://github.com/DocSavage/sharded_counter/blob/master/counter.py似乎確保即使在通過memcache發生數據庫錯誤的情況下也更新計數器。但如果事務失敗,我不想增加計數器。

另一個想法是記住我必須在Web請求期間增加的計數器,並在單個延遲任務中增加它們。我不知道如何以乾淨和線程安全的方式實現這一點,而無需將請求中創建的對象傳遞給模型方法。我認爲這段代碼會很難看,並且不在同一個transcation中:

def my_request_handler(): 
    counter_session = model.counter_session() 
    model.mylogic(counter_session, other_params) 
    counter_session.write() 

任何經驗或想法?

順便說一句:我正在使用python,ndb和flask 如果計數器不是100%準確的,那就沒關係。

回答

0

正如Transactions and entity groups說:

最簡單的方法是確定你需要 能夠在同一個事務要處理的實體。然後,當你創建這些實體時,通過聲明一個 共同祖先將它們放在同一個實體組中。然後他們將全部處於同一個實體組中,並且您將始終能夠更新並以事務方式閱讀這些實體組。

+0

這應該可能是一個評論而不是答案 – Fiver 2013-11-24 14:03:57