문제

현재 Azure 테이블 스토리지 응용 프로그램을 개발 중입니다. 이 응용 프로그램에는 상대적으로 적은 삽입물 (2 천일)을 갖는 테이블이 있으며이 엔티티의 주요 키는 다른 테이블에 사용되며 수십억 행이 있습니다.

따라서 작은 테이블의 기본 키로 Guid 대신 자동 증가 된 정수를 사용하는 방법을 찾고 있습니다 (삽입물의 많은 저장 및 확장 성이 실제로 문제가되지 않기 때문에).

주제에 대한 논의가있었습니다. http://social.msdn.microsoft.com/forums/en/windowsazure/thread/6b7d1ece-301B-44F1-85AB-EEB274349797.

그러나 동시성 문제는 실제로 디버깅하고 자리를 잡기가 어려울 수 있으므로 직접 구현하는 것이 불편합니다. 그러므로 내 질문은 이것에 대한 잘 테스트 된 고전이 있다면?

도움이 되었습니까?

해결책

아직 구현하지는 않았지만 작업 중입니다 ...

다음 ID를 사용하여 대기열을 씨를 뿌릴 수 있으며 필요할 때 대기열에서 선택할 수 있습니다.

대기열에 추가 된 가장 큰 숫자의 값을 포함하려면 테이블을 보관해야합니다. 당신이 당신이 당신이 정수를 사용하지 않을 것이라는 것을 알고 있다면, 당신은 종종 일어나서 종종 일어나서 대기열에 정수가 있는지 확인할 수 있습니다. 또한 사용중인 큐를 가질 수 있습니다. 작업자는 사용법을 주시하기 위해 점검 할 수 있습니다.

코드에 ID가 필요할 때 (우연히) 큐가 비어 있으면 작업자를 연결할 수 있습니다.

해당 전화가 실패한 경우 (근로자에게 작업을 수행하겠다고 말하고 (잠금) 작업자에게 다음 ID를 얻고 잠금 해제를하는 작업을 수행해야합니다).

  1. 자물쇠
  2. 테이블에서 생성 된 마지막 키를 가져옵니다
  3. 증가하고 저장하십시오
  4. 터놓다

그런 다음 새 값을 사용하십시오.

다른 팁

검색에서 찾을 수있는 모든 사람에게는 더 나은 솔루션이 있습니다. 테이블 잠금의 최소 시간은 15 초입니다 - 끔찍 해요. 진정으로 확장 가능한 솔루션을 만들려면 사용하지 마십시오. 사용 Etag!

ID 용 테이블에 하나의 엔티티를 만듭니다 (ID 또는 무엇이든 이름을 지정할 수도 있습니다).

1) 읽으십시오.

2) 증분.

3) insertorupdate 와 함께 ETag 지정된 (읽기 쿼리에서).

마지막 작업 인 경우 (InsertOrUpdate) 성공하면 새롭고 독특하고 자동 증가 된 ID가 있습니다. 실패한 경우 (예외 HttpStatusCode == 412), 다른 클라이언트가 변경했음을 의미합니다. 그러니 다시 1,2와 3을 반복하십시오. Read+InsertOrUpdate 보다 적습니다 200ms. 내 테스트 유틸리티 Github에 소스가 있습니다.

보다 고유 한 게이터 클래스 Josh Twist.

내가 찾은 솔루션은 중복 ID를 방지하고 자동화 할 수 있도록합니다.

  1. 자물쇠 (임대) 덩어리 그리고 그것이 논리적 인 게이트 역할을하자.

  2. 그런 다음 값을 읽으십시오.

  3. 증분 값을 작성하십시오

  4. 임대를 해제하십시오

  5. 앱/테이블에서 값을 사용하십시오

그런 다음 해당 과정에서 근로자 역할이 충돌하는 경우 상점에 누락 된 신분증이 있습니다. 복제보다 낫습니다.

여기에 있습니다 코드 샘플 및 추가 정보 Steve Marx 의이 접근법

안내를 피해야하는 경우 날짜/시간을 기준으로 무언가를 사용한 다음 동시성 위험을 최소화하기 위해 파티션 키를 활용하는 것을 고려한 적이 있습니까?

파티션 키는 사용자, 연도, 월, 일, 시간 등이 될 수 있으며 행 키는 동시성을 제어하기에 충분히 작은 시간의 나머지 시간 일 수 있습니다.

물론 Azure의 날짜가 날짜로, 안내를 피하는 것이 실제로이 모든 추가 노력의 가치가 있다면 (안내가 효과가 있다고 가정) 스스로에게 물어봐야합니다.

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