2016-07-17 4 views
0

리더 보드에 Azure 테이블 저장소를 사용하는 게임을 만들고 싶습니다.Azure 테이블 저장소를 사용하는 게임의 경우 점수 + GUID를 RowKey로 사용

Azure Table Storage에서 정렬 된/페이지 된 목록을 표시하려면 내 테이블 엔티티의 RowKey로 점수를 사용해야합니다. (I 각 생성 RowKey이 고유한지 확인하기 위해 플레이어 GUID를 추가하기 위하여려고하고있다.) 여기

이 추천 내 관심사 :

  • 다른 선수 (을 감소 같은) 선수의 점수에 영향을 미칠 수 따라서 동시성 문제가 고려 될 수 있습니다. 게임 클라이언트가 플레이어의 점수를 업데이트하려고 시도하고 이전 점수를 사용하여 테이블 엔티티를 검색하면 다른 클라이언트가 이미이를 업데이트 한 경우 해당 행을 찾지 못할 수도 있습니다.

  • 플레이어 이름과 같은 테이블 엔티티 (파티션 + 속성)를 검색하기 위해 다른 필드를 사용하는 경우 쿼리가 최적이되지 않습니다.

행 업데이트를 수행하는 더 나은 방법은 무엇입니까? 잠금 기술을 사용하고 RowKey로 검색해야합니까? 아니면 사용자 이름을 사용하여 검색합니까?

또는 점수를 RowKey로 사용하고 전체 테이블을 검색 한 후 리더 보드에 페이지를 표시 한 후 메모리에서 정렬하는 아이디어를 포기해야합니까?

순간적으로 점수 업데이트와 리더 보드보기가 똑같이 빈번하다고 가정합니다.

+0

재시도주기 내 첫 번째 작업으로 Partition + Attribute 쿼리를 사용한 다음 해당 블록 내에서 업데이트를 수행합니다. 어떤 이유로 든 실패하면 동일한 쿼리를 사용하여 엔티티를 다시 가져옵니다. 재 시도 횟수 후에 종료됩니다. 효율적이지는 않지만 Azure Queue + 적어도 하나의 기본 인스턴스가 필요한 지속적으로 실행되는 단일 Webjob과 같은 싱글 톤 솔루션을 사용하지 않고 생각할 수있는 유일한 방법입니다. –

답변

1

귀하의 요구 사항을 충족시키기 위해 RowKey 또는 PartitionKey을 활용하는 것은 적절하지 않습니다. 파티션 키와 행 키의 조합은 테이블 저장 영역에있는 엔티티의 ID입니다. 삽입 작업에서 정의한 후에는 다시 업데이트 할 수 없습니다. 자세한 내용은 MSDN https://social.msdn.microsoft.com/Forums/azure/en-US/7ad92641-3b0b-4faa-989f-3506fab47325/can-we-update-partition-key-or-row-key-in-azure-table-storage?forum=windowsazuredata의 스레드를 참조하십시오.

또한, https://azure.microsoft.com/en-us/documentation/articles/storage-table-design-guide/#sorting-data-in-the-table-service의 설명과 같이

테이블 서비스에 PartitionKey에 다음 RowKey에 의해 기반으로 오름차순으로 정렬 개체를 반환합니다.

따라서 Azure 테이블 저장소는 사용자의 시나리오에 적합하지 않습니다. 귀하는 귀하의 요구 사항을 충족시키기 위해 Azure SQL Database을 활용할 수 있습니다.

+0

파티션이나 행 키를 업데이트 할 수 없다는 것을 알고 있으며 레코드를 삭제하고 변경해야하는 경우 새 레코드를 삽입해야합니다. 필자는 비용과 확장 성 측면에서 Azure Table Storage에서 이러한 한계를 해결하기로 결정했습니다. –

+1

멋지다. 비슷한 생각으로 다른 커뮤니티에 도움이 될 답변으로 아이디어를 공유해 주실 수 있습니까? –

+0

죄송합니다. "나는 Azure Tablet Storage로 Azure SQL 대신 비용 및 확장 성을 이유로 이러한 제한 사항을 처리하기로 결정했습니다." –