Счетчики осколков App Engine и хранилище данных с высокой репликацией

Я использую App Engine со стабильным хранилищем данных с высокой репликацией. Я также использую подсвеченные счетчики.

Когда я запрашиваю все осколки и суммирую их, могу ли я считать, что подсчеты сильно согласованы? То есть, будет ли приведенный ниже код возвращать точную сумму моих подсчетов осколков?

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

Ответ 1

Если вы хотите создать сильно согласованные подсвеченные счетчики, вы должны использовать ключи, а не запросы.

#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)

Выполните инкремент внутри транзакции, чтобы обеспечить согласованность.

Ответ 2

Нет. Даже извлекая ключ, вы не можете полагаться на строго согласованный счет (хотя он будет более актуальным, чем в противном случае). Операции пакетного ввода не являются транзакционными, поэтому один из фрагментов может быть обновлен, пока вы их извлекаете.

Просьба о сильной консистенции здесь, однако, не имеет смысла. Во-первых, в распределенной системе, такой как App Engine, одновременность является нечеткой концепцией в лучшие времена - синхронизация требует координации, что создает узкие места. Во-вторых, даже если вы можете получить транзакционную сумму значений счетчика, она будет устаревать с момента ее получения, поскольку счетчики могут быть обновлены сразу же после их прочтения.

Ответ 3

Запросы в конечном итоге согласуются с HRD, поэтому вы не можете быть уверены, что объекты, которые вы получаете через запрос, обновляются. Если запрос зависит от свойства объекта, которое обновляется, запрос может даже не обнаруживать объект.

Ответ 4

Вы можете увеличить вероятность того, что подсвеченный счетчик будет соответствовать текущему состоянию, но вы не можете (насколько мне известно) получить эту вероятность до 100%.