2013-11-21 3 views
0

그래, 일련 번호 생성과 같은 간단한 작업으로 인해 클라우드에서 문제가 발생했습니다. 두 개 이상의 서버가있는 경우 서버간에 할당 된 수가 충돌하지 않도록하는 것이 점점 어려워집니다.클라우드에서 연속 번호 매기기

도움이된다면 Azure 서버를 사용하고 있습니다.

앱 캐시 사용에 대해 생각했지만 서버간에 업데이트가 보장 될 수 없습니다.

는 우리는 사용에 제한됩니다 또는 일부 서버 또는 사이 방법은 BLOB 저장소를 사용하고 날짜 수를 최대 개까지 nost를 저장하기 위해 잠금을 utalise 피어 투 피어 ID 열이있는 SQL 테이블. (이것에는 스케일링 문제가있을 수있다)

나는 누구든지 이것을 해결할 해결책이 있는지 궁금해 한단 말인가? 분명히 그 간단한 문제이며 지금까지 해결되었을 것입니다.

답변

0

이 (되나 보장 고유해야하는) I 다음 패턴을 고려하는 것이 좋습니다. 나는 대용량 전자 상거래 클라이언트가 고유 한 int PK를 필요로하기 때문에 이것을 구현하는 데 도움을 주었다.

큐를 생성하고이 큐를 순차적 정수로 채우는 작고 항상 실행되는 프로세스를 생성한다. 마지막으로 생성 된 번호를 기억하고 큐가 비어있게되면 더 많은 숫자로 풀을 계속 보냄)

이제 큐에서 다음 번호를 폴링하고 큐에서 삭제 한 다음 이를 SQL Azure 데이터베이스에 저장하려고 시도합니다. 실패한 경우 순번에 "구멍"만 있으면됩니다. 자주 삽입되는 시나리오에서는 데이터베이스에 순서대로 저장하지 않을 수 있습니다 (대기열에서 폴링하는 두 개의 프로세스가 먼저 폴링하지만 마지막으로 저장하면 데이터베이스에 저장된 PK는 더 이상 순차적이지 않습니다)

가장 큰 단점은 다음과 같습니다. 이제는 PK 풀을 보충하는 프로세스를 유지 보수해야합니다.

+0

감사합니다. 숫자가 항상 증가하는 한 우리는 공백으로 살 수 있습니다. 현재로서는 처리량이 낮아 전용 서비스를 사용하는 것이 다소 과잉 일 수 있습니다. 궁극적으로 이것이 효과가 있습니다. 좀 더 연구를 해보 겠지만 아래의 두 번째 해결책은 우리에게 충분할 것입니다. –

0

this을 읽은 후에는 ID 열을 신뢰하지 않습니다.

삽입하기 전에 가장 좋은 방법은 마지막으로 저장된 ID를 얻고 하나씩 늘리는 것입니다. (프로그래밍 방식으로). 또 다른 옵션은 트리거를 만드는 것입니다. 그러나 DB에 대해 많은 동시 요청을 받거나 테이블에 수백만 개의 레코드가있는 경우 대량이 될 수 있습니다.

create trigger trigger_name 
on table_name 
after insert 
as 
declare @seq int 
set @seq = (select max(id) + 1 from table_name) 
update table_name 
    set table_name.id = @seq 
    from table_name 
    inner join inserted 
    on table_name.id = inserted.id 

상세 정보 : 당신은 당신이 중앙 위치에서 얻을 수는 항상 순차적 아니다 가끔 사용 사례와 함께 살 수있는 경우

http://msdn.microsoft.com/en-us/library/windowsazure/ee336242.aspx

+0

이 개념이 효과적입니다. 일괄 삽입에 대한 트리거가 실패하지 않습니까? –

+0

당신 말이 맞습니다. 최선의 선택은 본인 확인 절차입니다.또한 잠금을 사용하여 동시 스레드를 보호 할 수 있습니다. –

+0

이 솔루션은 효과가 있지만 SQL과 관련이없는 것은 무엇입니까? –

0

blob을 사용할 때 숫자 생성을 조정할 염려가있는 경우 GitHubNuget에있는 SnowMaker 라이브러리를 사용할 수 있습니다. ids의 블록을 로컬 캐시로 가져 와서 규모 문제를 해결합니다. 이렇게하면 ID가 고유하지만 둘 이상의 서버가있는 경우 ID가 반드시 순 w하지는 않습니다. 그게 네가 한 일을 성취 할 수 있을지 모르겠다.