4

저는 결국 일관성 높은 높은 복제 데이터 저장소가있는 App Engine을 사용하고 있습니다. 또한 샤드 카운터를 사용하고 있습니다.App Engine 샤드 카운터 및 높은 복제 데이터 스토어

모든 샤드를 쿼리하여 합산 한 결과, 그 수가 매우 일정하다고 생각할 수 있습니까? 즉, 아래 코드가 샤드 카운트의 정확한 합계를 반환합니까?

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

정확하게 대답은 아니지만 'my_sum = sum (Counter.all())의 카운터에 counter.count'를 수행 할 수 있음을 알고 있으며 물론 'sum'변수를 호출하면 문제를 묻는 중입니다. – hochl

+0

좋은 점, 그 점을 잊어 버렸습니다. –

답변

2

강력하게 일치하는 샤드 드 카운터를 만들려면 쿼리가 아닌 키를 사용해야합니다.

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

일관성을 유지하기 위해 트랜잭션 내에서 증가를 수행하십시오.

+0

감사합니다. 고마워요. –

0

쿼리는 결국 HRD에서 일관되므로 쿼리를 통해 얻은 엔티티가 업데이트되는지 확신 할 수 없습니다. 쿼리가 업데이트되는 엔터티 속성에 의존하면 쿼리가 엔터티를 찾지 못할 수도 있습니다.

0

샤드 드 카운터가 현재 상태를 합칠 확률을 높일 수는 있지만, 내가 아는 한 최선의 방법으로 그 확률을 100 %로 할 수는 없습니다.

4

아니요. 키를 가져 오는 경우에도 강력하게 일관된 수에 의존 할 수 없습니다 (단, 그렇지 않은 경우보다 최신 정보 임). Batch get 작업은 트랜잭션이 아니므로 Shards 중 하나를 가져 오는 동안 업데이트 할 수 있습니다.

여기에 강한 일관성을 요구하는 것은 의미가 없습니다. 첫째, App Engine과 같은 분산 시스템에서 동시성은 퍼지 개념 인 것이 가장 좋습니다. 동기화를 위해서는 조정이 필요하므로 병목 현상이 발생합니다. 둘째, 카운터 값의 트랜잭션 합계를 가져올 수 있더라도 카운터를 가져온 순간 카운터가 즉시 업데이트 될 수 있기 때문에 카운터 값을 가져온 순간이 지나치게 오래된 것입니다.

관련 문제