我必須在一次交易中增加三個不同的計數器。除此之外,我還必須操縱其他三個實體。我得到單個交易中許多不同的分片計數器
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%準確的,那就沒關係。
這應該可能是一個評論而不是答案 – Fiver 2013-11-24 14:03:57