Python 应用程序引擎碎片计数器和高复制数据存储

Python 应用程序引擎碎片计数器和高复制数据存储,python,google-app-engine,google-cloud-datastore,eventual-consistency,Python,Google App Engine,Google Cloud Datastore,Eventual Consistency,我将应用程序引擎与最终一致的高复制数据存储一起使用。我也在使用碎片计数器 当我查询所有碎片并将其相加时,我可以假设计数是强一致的吗?也就是说,下面的代码会返回我的碎片计数的准确总和吗 sum = 0 for counter in Counter.all(): sum += counter.count 查询最终在HRD中是一致的,所以您不能确定通过查询获得的实体是否已更新。如果查询依赖于正在更新的实体属性,则查询甚至可能找不到该实体。如果要创建强一致的分片计数器,则应使用键,而不是查询

我将应用程序引擎与最终一致的高复制数据存储一起使用。我也在使用碎片计数器

当我查询所有碎片并将其相加时,我可以假设计数是强一致的吗?也就是说,下面的代码会返回我的碎片计数的准确总和吗

sum = 0
for counter in Counter.all():
    sum += counter.count

查询最终在HRD中是一致的,所以您不能确定通过查询获得的实体是否已更新。如果查询依赖于正在更新的实体属性,则查询甚至可能找不到该实体。

如果要创建强一致的分片计数器,则应使用键,而不是查询

#for getting
total = 0
shard_keys = []
for i in range(20): #20 shards
    key_name = shard + str(i)
    shard_keys.append(db.Key.from_path('Counter', key_name))
counters = db.get(shard_keys)
for counter in counters:
    if counter:
        total += counter.count

#for incrementing a shard
import random
key_name = 'shard' + str(int(random.random()*20)) #choose a random shard
counter = Counter.get_by_key_name(key_name) #try to retrieve from datastore
if not counter:
    counter = Counter(key_name=key_name) #shard doesn't exist, create one
counter.count += 1
db.put(counter)

在事务中执行递增以确保一致性。

您可以增加碎片计数器合计当前状态的概率,但您无法(据我所知)将该概率提高到100%。

否。即使通过键获取,您也不能依赖强一致性计数批处理获取操作不是事务性的,因此在获取碎片时可以更新其中一个碎片


然而,在这里要求强大的一致性是毫无意义的。首先,在像App Engine这样的分布式系统中,同时性在最好的时候是一个模糊的概念——同步需要协调,这会造成瓶颈。其次,即使你可以得到计数器值的事务性总和,它在你离开时也已经过时了蚀刻了它,因为计数器可以在您读取它们之后立即更新。

不完全是答案,但您知道您可以只执行
my_sum=sum(counter.count for counter in counter in counter.all())
,当然调用变量
sum
是在问问题。好的一点,忘了这一点。