【问题标题】:Many different sharded counters in single transaction单个事务中有许多不同的分片计数器
【发布时间】:2013-04-25 10:04:34
【问题描述】:

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

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 发生 db 错误的情况下,它似乎也能确保更新计数器。但如果交易失败,我不想增加我的计数器。

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

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

有什么经验或想法吗?

顺便说一句:我正在使用 python、ndb 和烧瓶 如果计数器不是 100% 准确也没关系。

【问题讨论】:

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


    【解决方案1】:

    Transactions and entity groups中所说:

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

    【讨论】:

    • 这应该是评论而不是答案
    猜你喜欢
    • 1970-01-01
    • 2011-04-16
    • 2011-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多