Azure 테이블 스토리지에 자동 점수
-
18-09-2019 - |
문제
현재 Azure 테이블 스토리지 응용 프로그램을 개발 중입니다. 이 응용 프로그램에는 상대적으로 적은 삽입물 (2 천일)을 갖는 테이블이 있으며이 엔티티의 주요 키는 다른 테이블에 사용되며 수십억 행이 있습니다.
따라서 작은 테이블의 기본 키로 Guid 대신 자동 증가 된 정수를 사용하는 방법을 찾고 있습니다 (삽입물의 많은 저장 및 확장 성이 실제로 문제가되지 않기 때문에).
주제에 대한 논의가있었습니다. http://social.msdn.microsoft.com/forums/en/windowsazure/thread/6b7d1ece-301B-44F1-85AB-EEB274349797.
그러나 동시성 문제는 실제로 디버깅하고 자리를 잡기가 어려울 수 있으므로 직접 구현하는 것이 불편합니다. 그러므로 내 질문은 이것에 대한 잘 테스트 된 고전이 있다면?
해결책
아직 구현하지는 않았지만 작업 중입니다 ...
다음 ID를 사용하여 대기열을 씨를 뿌릴 수 있으며 필요할 때 대기열에서 선택할 수 있습니다.
대기열에 추가 된 가장 큰 숫자의 값을 포함하려면 테이블을 보관해야합니다. 당신이 당신이 당신이 정수를 사용하지 않을 것이라는 것을 알고 있다면, 당신은 종종 일어나서 종종 일어나서 대기열에 정수가 있는지 확인할 수 있습니다. 또한 사용중인 큐를 가질 수 있습니다. 작업자는 사용법을 주시하기 위해 점검 할 수 있습니다.
코드에 ID가 필요할 때 (우연히) 큐가 비어 있으면 작업자를 연결할 수 있습니다.
해당 전화가 실패한 경우 (근로자에게 작업을 수행하겠다고 말하고 (잠금) 작업자에게 다음 ID를 얻고 잠금 해제를하는 작업을 수행해야합니다).
- 자물쇠
- 테이블에서 생성 된 마지막 키를 가져옵니다
- 증가하고 저장하십시오
- 터놓다
그런 다음 새 값을 사용하십시오.
다른 팁
검색에서 찾을 수있는 모든 사람에게는 더 나은 솔루션이 있습니다. 테이블 잠금의 최소 시간은 15 초입니다 - 끔찍 해요. 진정으로 확장 가능한 솔루션을 만들려면 사용하지 마십시오. 사용 Etag
!
ID 용 테이블에 하나의 엔티티를 만듭니다 (ID 또는 무엇이든 이름을 지정할 수도 있습니다).
1) 읽으십시오.
2) 증분.
3) insertorupdate 와 함께 ETag
지정된 (읽기 쿼리에서).
마지막 작업 인 경우 (InsertOrUpdate
) 성공하면 새롭고 독특하고 자동 증가 된 ID가 있습니다. 실패한 경우 (예외 HttpStatusCode
== 412), 다른 클라이언트가 변경했음을 의미합니다. 그러니 다시 1,2와 3을 반복하십시오. Read+InsertOrUpdate
보다 적습니다 200ms. 내 테스트 유틸리티 Github에 소스가 있습니다.
보다 고유 한 게이터 클래스 Josh Twist.
내가 찾은 솔루션은 중복 ID를 방지하고 자동화 할 수 있도록합니다.
자물쇠 (임대) 덩어리 그리고 그것이 논리적 인 게이트 역할을하자.
그런 다음 값을 읽으십시오.
증분 값을 작성하십시오
임대를 해제하십시오
앱/테이블에서 값을 사용하십시오
그런 다음 해당 과정에서 근로자 역할이 충돌하는 경우 상점에 누락 된 신분증이 있습니다. 복제보다 낫습니다.
여기에 있습니다 코드 샘플 및 추가 정보 Steve Marx 의이 접근법
안내를 피해야하는 경우 날짜/시간을 기준으로 무언가를 사용한 다음 동시성 위험을 최소화하기 위해 파티션 키를 활용하는 것을 고려한 적이 있습니까?
파티션 키는 사용자, 연도, 월, 일, 시간 등이 될 수 있으며 행 키는 동시성을 제어하기에 충분히 작은 시간의 나머지 시간 일 수 있습니다.
물론 Azure의 날짜가 날짜로, 안내를 피하는 것이 실제로이 모든 추가 노력의 가치가 있다면 (안내가 효과가 있다고 가정) 스스로에게 물어봐야합니다.