메시지 순서 지정 및 타임스탬프
시퀀싱과 타임스탬프는 수신되거나 탐색된 메시지의 SequenceNumber
및 EnqueuedTimeUtc
속성을 통해 모든 Service Bus 엔터티 및 표면에서 항상 사용되는 두 가지 기능입니다.
메시지의 절대적 순서가 중대하거나 소비자가 메시지에 대해 신뢰할 수 있는 고유 식별자를 필요로 할 경우 Broker가 메시지에 gap-free를 스탬프하여 큐나 토픽에 상대적인 시퀀스 번호를 증대할 수 있습니다. 분할된 엔터티의 경우 시퀀스 번호는 파티션에 상대적으로 발생됩니다.
시퀀스 번호
SequenceNumber
값은 브로커가 메시지를 수락하고 저장할 때 메시지에 할당되는 고유한 64비트 정수이며 메시지의 내부 식별자로 작동합니다. 분할된 엔터티의 경우 최상위 16비트는 파티션 식별자를 나타냅니다. 64비트 또는 48비트(파티션 식별자의 16비트 제외) 범위가 모두 사용되면 시퀀스 번호는 0으로 롤오버됩니다.
시퀀스 번호는 클라이언트가 아닌 중앙 및 중립 기관에서 할당하므로 고유 식별자로 신뢰할 수 있습니다. 또한 실제 도착 순서를 나타내며 순서 기준으로는 타임스탬프보다 정확합니다. 타임스탬프는 메시지 비율이 매우 높을 때 필요한 만큼의 확인을 갖지 못하고 노드 간에 Broker 소유권이 이전될 때 (미세한) 시계 오차가 발생할 수 있습니다.
제공 상품의 한정 수량을 공급 가능한 동안만 선착순으로 서비스하거나 콘서트 티켓을 판매하는 상황을 절대적 도착 순서가 중요한 경우의 예로 들 수 있습니다.
타임스탬프
타임스탬프 기능은 EnqueuedTimeUtc
속성에 반영된 메시지 도착 UTC 시간을 정확하게 캡처하는 중립적이고 신뢰할 수 있는 기관 역할을 합니다. 이 값은 작업 항목을 특정일 자정 전에 제출했으나 처리는 큐 백로그보다 훨씬 늦어지는 등, 기한이 중요한 비즈니스 시나리오에서 유용합니다.
참고 항목
시퀀스 번호는 자체적으로 메시지의 큐 순서 및 추출기 순서를 보장하지만 세션이 필요한 처리 순서는 보장하지 않습니다.
예를 들어 큐의 5개 메시지와 2개 소비자가 있습니다. 소비자 1은 메시지 1을 선택합니다. 소비자 2는 메시지 2를 선택합니다. 소비자 2는 메시지 2 처리를 완료하고 메시지 3을 선택하지만 소비자 1은 아직 메시지 1을 처리하지 않습니다. 소비자 2는 메시지 3 처리를 완료했지만 소비자 1은 아직 메시지 1을 처리하지 않습니다. 마지막으로 소비자 1이 메시지 1 처리를 완료합니다. 따라서 메시지는 메시지 2, 메시지 3 및 메시지 1 순서로 처리됩니다. 메시지 1, 2 및 3을 순서대로 처리해야 하는 경우 세션을 사용해야 합니다.
따라서 메시지를 순서대로 검색해야 하는 경우 세션을 사용할 필요가 없습니다. 메시지를 순서대로 처리해야 하는 경우 세션을 사용합니다. 한 집합의 메시지 1, 4 및 8과 다른 집합의 2, 3 및 6일 수 있는 함께 속한 메시지에 동일한 세션 ID를 설정해야 합니다.
자세한 내용은 Service Bus 메시지 세션을 참조하세요.
예약된 메시지
지연 처리를 위해 큐 또는 토픽에 메시지를 제출할 수 있습니다. 특정 시간에 시스템에서 처리할 수 있게 되는 작업 예약을 예로 들 수 있습니다. 이 기능은 신뢰할 수 있는 분산된 시간 기반 스케줄러를 인식합니다.
예약된 메시지는 정의된 큐에 넣기 시간이 되어야 큐에 구체화됩니다. 이 시간 이전에는 예약된 메시지를 취소할 수 있습니다. 취소는 메시지를 삭제합니다.
다음 두 가지 방법으로 모든 클라이언트를 사용하여 메시지를 예약할 수 있습니다.
- 일반 보내기 API를 사용하지만 보내기 전에 메시지에서
ScheduledEnqueueTimeUtc
속성을 설정합니다. - 메시지 예약 API를 사용하여 일반 메시지와 예약된 시간을 모두 전달합니다. API는 예약된 메시지의
SequenceNumber
를 반환하는데, 필요한 경우 나중에 이를 사용하여 예약된 메시지를 취소할 수 있습니다.
예약된 메시지와 해당 시퀀스 번호도 메시지 찾아보기로 검색할 수 있습니다.
예약된 메시지의 SequenceNumber
는 메시지가 예약된 상태인 동안에만 유효합니다. 메시지가 활성 상태로 전환되면 메시지는 현재 인스턴스의 큐에 넣어진 것처럼 큐에 추가되며 새 SequenceNumber
가 할당됩니다.
이 기능은 개별 메시지에 고정되며 메시지는 한 번만 큐에 넣을 수 있으므로 Service Bus가 메시지의 예약 반복을 지원하지 않습니다.
참고 항목
- 메시지 큐에 담는 시간이 메시지를 동시에 전송한다는 의미는 아닙니다. 큐에 넣기는 하지만 실제 전송 시간은 큐의 워크로드 및 상태에 따라 달라집니다.
- 성능상의 이유로, 예약된 메시지의 활성화와 취소는 상호 잠금 없이 독립적인 작업입니다. 메시지가 활성화되는 과정에 있고 동시에 취소되는 경우, 활성화 프로세스는 되돌려지지 않으며 메시지는 계속 활성화됩니다. 게다가 이로 인해 예약된 메시지 수가 음수로 표시될 가능성이 있습니다. 이러한 경합 상태를 최소화하려면 활성화 및 취소 작업을 짧은 연속으로 예약하지 않는 것이 좋습니다.
워크플로에서 예약된 메시지 사용
명시적인 시간 구성 요소(예: 2단계 인증에 대한 5분 제한 시간, 사용자의 이메일 주소 확인에 대한 1시간 제한 시간 등과 은행 및 보험과 같은 도메인의 며칠, 몇 주 또는 몇 달 간의 장기 구성 요소)가 있는 장기 실행 비즈니스 워크플로를 보는 것이 일반적입니다.
이러한 워크플로는 일부 메시지 처리로 시작되는 경우가 많습니다. 이러한 경우 일부 상태를 저장한 다음 나중에 프로세스를 계속하도록 메시지를 예약합니다. NServiceBus 및 MassTransit과 같은 프레임워크를 사용하면 이러한 모든 요소를 더 쉽게 통합할 수 있습니다.
관련 콘텐츠
Service Bus 메시징에 대해 자세히 알아보려면 다음 항목을 참조하세요.