문제

고려 GAE(python)용할 수 있는 사용자가에 댓글을 노래이다.예상된 수의 사용자에게 1,000,000+.예상의 곡 수은 5,000.

이용할 수 있어야 합:

  • 게 노래의 번호를 사용자가에 댓글
  • 을 줄 수 있는 사용자가에 댓글을 노래

카운터 관리해야 합 트랜잭션 그래서 그들은 항상 반영한 기초 데이터.

그것은 보인다 GAE 앱을 유지해야 하는 이러한 유형의 계산 계산되는 모든 시간 이후에 대한 쿼리를 그 요청에 따라간 것입 비효율적이다.

나의 데이터 모델

class Song(BaseModel):
    name = db.StringProperty()
    # Number of users commenting on the song
    user_count = db.IntegerProperty('user count', default=0, required=True)
    date_added = db.DateTimeProperty('date added', False, True)
    date_updated = db.DateTimeProperty('date updated', True, False)

class User(BaseModel):
    email = db.StringProperty()
    # Number of songs commented on by the user
    song_count = db.IntegerProperty('song count', default=0, required=True)
    date_added = db.DateTimeProperty('date added', False, True)
    date_updated = db.DateTimeProperty('date updated', True, False)

class SongUser(BaseModel):
    # Will be child of User
    song = db.ReferenceProperty(Song, required=True, collection_name='songs')
    comment = db.StringProperty('comment', required=True)
    date_added = db.DateTimeProperty('date added', False, True)
    date_updated = db.DateTimeProperty('date updated', True, False)

코드
이를 처리하는 사용자의 노래를 계산 트랜잭션이지만 이 노래의 사용자 계산합니다.

s = Song(name='Hey Jude')
s.put()

u = User(email='me@example.com')
u.put()

def add_mapping(song_key, song_comment, user_key):
    u = User.get(user_key)

    su = SongUser(parent=u, song=song_key, song_comment=song_comment, user=u);
    u.song_count += 1

    u.put()
    su.put()

# Transactionally add mapping and increase user's song count
db.run_in_transaction(add_mapping, s.key(), 'Awesome', u.key())

# Increase song's user count (non-transactional)
s.user_count += 1
s.put()

질문입니다: 할 수 있는 방법을 모두 관리 카운터를 트랜잭션?

에 따라 이해 내는 이 불가능하기 때문에 사용자,노래와 SongUser 것이어야 하는 부분의 동 그룹 엔티티.그들은 할 수 없습에 하나의 엔티티가 그룹은 다음 때문에 모든 데이터는 것에 한 그룹과 그것은 배포할 수 없으로 사용자.

도움이 되었습니까?

해결책

당신이 정말로 걱정할 필요가 없 처리에 대한 사용자의 개수의 노래에서 그들이 댓글을 트랜잭션 내부에서 보이기 때문에 가능성이 있는 사용자가 될 수 있을 의견에 하나 이상의 노래에서는 시간,오른쪽?

지금,그것은 확실히 경우는 많은 사용자가 될 수 있습에 대한 주석 같은 노래는 한 번에,그래서 당신 걱정을 확인하는 데이터 없습니다 잘못된 경쟁 상태입니다.

그러나,당신이 당신을 유지하의 개수가 있는 사용자에 댓글을 노래를 내부에 노래 실체와 잠금 entity 트랜잭션으로,당신은 매우 높은 경쟁에 대한 엔터티 및 데이터 저장소 제한 시간을 만들 것입니다 당신은 응용 프로그램이 많은 문제가 발생합니다.

이 대답은 이 문제에 대한 분할된 카운터.

지 확인하기 위해 만들 수 있는 새로운 SongUser 엔터티 및 업데이트 관련된 노래의 분할된 카운터를 사 SongUser 엔티티가 관련된 노래로 부모입니다.는 것에 넣어 같은 엔터티를 그룹에 있는 모두를 만들 SongUser 업데이트 분할에서 카운터 같은 트랜잭션이 있습니다.이 SongUser 의 관계는 사용자를 생성할 수 있습에서 개최 ReferenceProperty.

에 대한 우려에 대해 두 업데이트(이하 하나의 트랜잭션과 사용자를 업데이트)모두 성공,즉 항상 가능성,하지만 주어진 것 하나 업데이트 실패 할 수 있습니다,당신은 필요한 적절한 예외 처리하도록 모두 성공합니다.는 중요한 포인트:에서 거래 업데이트하지 않은 성공을 보장합니다.를 얻을 수 있습니다 TransactionfailedError 한 경우 예외를 거래할 수 있는지 완료를 어떤 이유입니다.

경우에 따라서,트랜잭션이 완료된 예외를 발생시키지 않고,업데이트를 실행하는 사용자에 트랜잭션이 있습니다.는 당신을 얻을 것이 자동 재시도에 업데이트의 사용자에 한 일부 오류가 발생합니다.지 않으면 뭔가가 가능한 다툼에는 사용자 엔터티 내가 이해하지 못하는,가능성하지 않을 것이 결국 성공 뛰어나게 작.는 경우가 허용되지 않는 위험,그때 나는 생각하지 않는 애플리케이션은 이 문제에 대한 완벽한 솔루션을 위해 당신입니다.

먼저 요구하십시오: 그것은 정말 나쁜 경우에는 계산의 노래는 누군가에 댓글을 달았는가?은 이 중요 업데이트 은행 계좌 잔고하거나 완료하는 주식 판매?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top