2

이론적 시나리오 : GAE 데이터 스토어에 인벤토리를 유지하는 전자 상거래 웹 사이트가 있습니다. 각 레코드에는 항목의 이름과 개수가 포함됩니다. 이 상점에는 트래픽이 적고 재고가 많으므로 여러 고객이 동시에 같은 품목을 구입할 가능성은 거의 없습니다. 여기에 우리가 일정 기간 동안 초당 여러 번 동일한 레코드를 업데이트하는 데이터 저장소 제한에 집중하지 않도록하기 위해 여기에 있습니다.GAE Datastore 레코드 필드를 동시에 업데이트하십시오.

예를 들어 두 고객이 같은 품목을 동시에 구매하는 경우 항목의 레코드를 올바르게 업데이트하려면 어떻게해야합니까? 우리가 각 항목에 대해 올바른 수를 유지하는 것이 중요합니다.

mongo 세계에서 나는 $ inc 연산과 같은 것을 사용할 것입니다. GAE Datastore에 대해이 시나리오를 어떻게 처리 하시겠습니까? 동시에이 거래를 시도 할 수 있도록

감사

+1

네이티브 방식이 아닙니다. 데이터 저장소와 결합 된 memcached 내장 증분 메소드 사용에 대한 Google 100 % 완벽하지는 않지만 memcached 객체가 사용 된 직후 (거의없는 경우) 및 두 명의 사용자가 동시에 증가하는 경우에만 실패합니다. –

+0

흥미로운 접근 방법입니다. 고마워. –

답변

2

클라우드 데이터 저장소 거래, 낙관적 동시성을 사용합니다. 엔티티가 변경되면 실패합니다. 실패한 트랜잭션을 다시 시도하기 만하면됩니다.

예를 들어, Python NDB에서 트랜잭션 데코레이터의 재시도 횟수를 지정할 수 있습니다.

예제 코드 :

from google.appengine.ext import ndb 

... 

@ndb.transactional(retries=5) 
def inc_item_count(item_key, count_purchased): 
     item = item_key.get() 
     item.count_purchased += count_purchased 
     item.put() 

     return True 

웹 스케일?

이 솔루션의 작동 범위를 벗어나 확장하면 작업 큐 기반 시스템을 탐색하거나 항목 당 카운터를 sharding counters으로 이동해야합니다.

관련 문제