单个事务中的许多不同的分片计数器

时间:2013-04-25 10:04:34

标签: python google-app-engine google-cloud-datastore

我必须在一个事务中增加三个不同的计数器。除此之外,我还必须操纵其他三个实体。我得到了

too many entity groups in a single transaction

我已使用https://developers.google.com/appengine/articles/sharding_counters的收件人来实施我的计数器。我根据业务逻辑在一些模型(类)方法中增加我的计数器。

作为一种解决方法,我实现了一个延迟增量方法,该方法使用任务来更新计数器。但是,如果计数器的数量进一步增加,那么这并不能很好地扩展,因为单个交易中的任务也是有限的(我认为它是5)并且我认为它并不是最多的有效的方式。

我还发现https://github.com/DocSavage/sharded_counter/blob/master/counter.py似乎确保更新计数器,即使在通过memcache发生db错误的情况下也是如此。但如果交易失败,我不想增加我的柜台。

另一个想法是记住我必须在Web请求期间递增的计数器,并在单个延迟任务中递增它们。我不知道如何以干净和线程安全的方式实现它,而不将请求中创建的对象传递给模型方法。我认为这段代码很丑陋而不是同一个代码:

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

任何经验或想法?

BTW:我正在使用python,ndb和flask 如果计数器不是100%准确就没问题。

1 个答案:

答案 0 :(得分:0)

正如Transactions and entity groups所说:

  

最简单的方法是确定您需要哪些实体   能够在同一个交易中处理。然后,当你创建那些   实体,通过用a声明它们将它们放在同一个实体组中   共同祖先。然后他们将在同一个实体组中   您将始终能够以事务方式更新和阅读它们。