2013-09-06 3 views
2

NServiceBus가 메시지가 특정 순서로 처리된다는 것을 보장하지 않기 때문에 발신자가 보낸 순서대로 메시지를 처리하는 방법을 찾으려고합니다.nservicebus에서 메시지 순서를 처리하는 방법은 무엇입니까?

보낸 사람은 createOrder 및 reviseOrder 명령을 게시하는 주문 시스템입니다. 보낸 사람은 사용자가 동일한 순서에 여러 개정을 제출할 수있게하여 동시에 수정본 4와 수정 3이 대기열에있을 수 있습니다. 각 리비전에는 리비전 번호와 리비전 코드가있어 비즈니스 로직을 수행하므로 어떤 수정이나 최소한 그 이유를 무시할 수 없습니다.

  1. 저장 대상 기록과 개정 번호를 -

    내가 가진 아이디어의 몇

    은 다음과 같습니다. 보낸 사람은 각 개정 메시지에 개정 번호를 보냅니다. 핸들러는 보낸 사람과 대상 개정 번호를 비교합니다. 일치하는 경우 레코드가 업데이트되고 그렇지 않으면 메시지가 대기열의 끝에 있습니다. 이 방법을 사용하면 수정본 2 메시지가 실패하고 오류 대기열에 들어갑니다. 수정본 3은 절대로 처리되지 않습니다.

  2. 보낸 사람은 모든 개정 메시지의 모든 개정에 대한 모든 이유 코드의 내역을 보냅니다. 따라서 개정 2 메시지가 실패하면 수정 3 메시지는 모든 이유 Z 드를 갖습니다. 이러한 이유 코드는 대상에 기록되지만 이전 버전의 이유 코드와 관련된 비즈니스 논리는 발생하지 않을 수 있습니다.

이 시나리오에서는 어떻게 설계할까요?
또한 실패한 수정 메시지를 처리하는 방법에 대한 아이디어가 있습니까?

일부 안내는 정말 감사하겠습니다.

감사합니다.

답변

6

NserviceBus에 대한 기본 지침 중 하나는 순서에 상관없이 시스템을 구축해야한다는 것입니다. 내가 전에 NSB와 정렬 시스템을 구축했다 가졌, 나는 결정을 heres 어떻게해야 할 일 :

  • 시퀀스 번호를 확인 모든 메시지 수신기에서
  • 에 일련 번호를 추가 마지막으로 볼 수는 + 일하지 않으면 것은 그러나, 이것은 일반적으로 꽤 잘 작동

  • 하여 2 단계 재 시도를 활성화 (그래서 순서가있는 경우가 나중에 잘하면 올바른 메시지를받은 후 다시 시도합니다) 시퀀스 부족 예외를 던져 때로는 물건이 좀 이상하다면 힌지가 너무 오랫동안 순서가 맞지 않아 재순환을 수동으로해야합니다.

    시나리오에는 아마도 더 좋은 방법이있을 것입니다. 주문에 대한 개정 내에서만 주문을 원한다는 것을 감안할 때. 나는 당신이 주문한 배달을 요구하지 않는 방법으로 이것을 만들 수 있다고 생각합니다.

    • DB에 = 메시지의 버전 번호가>의 경우
    • 만 필드를 업데이트하면 수정으로 수정할 수있는 모든 필드에 마지막으로 개정을 개정 번호를 추가

    이것에는 많은 이점이 있습니다. 그것은 순서에 의존하지 않는

    • 는 각 메시지를 처리하는 수신기를 요구함으로써 부하를 줄여 한 번에 하나의 메시지에 문제가 있다면 모든 것을 중지하지 않음으로써 오류가 꽤 잘 다루는
    • .

    그러나 다음과 같은 단점이 있습니다 : DB를에

    • 추가 복잡성
    • 그것 결국 consistant, 당신은 DB를 보면 그것은 단지 사용자가 수행 한 편집의 일부를 포함 할 수있다. REV2 오류 및 rev3이 제대로 처리되는 경우
    • 는 일부 사용자가 늘 거기의 수정 사항 있지만, 일부 것이다
  • +0

    당신에게 누가 복음을 감사드립니다. – maddog

    +2

    NServiceBus가이 시나리오에 대한 프레임 워크 수준의 지원을 제공하는 것이 얼마나 중요합니까? –

    +0

    @UdiDahan 시나리오에서 우리는 주문을 요구하는 실수를 저질렀다고 생각했습니다. 내가 다시해야만한다면 나는 위에서 설명한 것과 비슷한 것을했을 것입니다. 더 나은 옵션은 프레임 워크에서 순서를 시행하는 대신 핸들러에서 모든 순서를 지원하는 것입니다.하지만 그것은 제 의견입니다. –