2013-04-16 4 views
1

핸들러가 수신하는 각 메시지에는 집계 루트의 전체 상태가 포함됩니다. 그러면 시스템은이 데이터를 기반으로 필요한 작업을 수행 할 수 있습니다. 내 시나리오에서는 메시지의 데이터를 기반으로 액세스 권한을 부여합니다. 방 A &에 대한 액세스 B. 메시지에는 허용 된 전체 액세스 세트가 들어 있습니다. MSMQ와 같은 메시징 시스템이 주문 된 배달을 보장하지 않기 때문에 이러한 메시지는 순서가 맞지 않을 수 있습니다.Rebus로 메시지를 필터링하는 방법은 무엇입니까?

메시지 # 1이 방 A & B에 대한 액세스를 허용하지만 메시지 # 2는 방 A에 대한 액세스 만 허용하는 시나리오입니다. 순서가 잘못된 순서로 도착하면 방 A에 액세스하고 나중에 액세스 할 수 있습니다. A & B.이 결과는 바람직하지 않습니다. 방 A에 대한 액세스 권한 만 부여해야합니다. 각 메시지에는 게시 될 때 설정된 타임 스탬프가 들어 있습니다. 이 타임 스탬프를 사용하여 예치치 않은 도착 메시지 (예 :)를 제거하고 싶습니다. 메시지 # 2가 메시지 # 1 전에 도달하면 메시지 1 #은 폐기되어야한다.

각 필터 메서드는이 필터를 구현할 수 있지만 지루한 일이 될 수 있으므로 Rebus에 EAI Message Filters 줄이 표시되기를 기대하고 있습니까?

다른 옵션/구현에 대해 열려 있습니까?

답변

1

메시지 안의 전체 집계 루트를 전달하는 이유를 잘 모르겠지만 Rebus가 메시지 순서를 지정할 수있는 간단한 방법이 있습니다.

모든 메시지가이 특정 측면을 캡처하는 공통 인터페이스를 구현하도록 제안합니다.

public interface IHaveSequenceNumber 
{ 
    int SequenceNumber { get; } 
} 

같은 그런 다음, 당신은 오래된 메시지가 발생하는 경우 핸들러 파이프 라인을 IHaveSequenceNumber을 처리하고 중단 간단한 메시지 핸들러, 예를 생성

public class WillDiscardOldMessages : IHandleMessages<IHaveSequenceNumber> 
{ 
    public void Handle(IHaveSequenceNumber messageWithSequenceNumber) 
    { 
     if (IsTooOld(messageWithSequenceNumber)) 
     { 
      MessageContext.GetCurrent().Abort(); //< make this the last handler 
     } 
    } 
} 

그리고 - 아주 중요한 : - 당신은 발송이 시작되면 메시지 필터가 핸들러의 파이프 라인에서 첫 항상 보장 :

Configure.With(...) 
    .Transport(...) 
    .SpecifyOrderOfHandlers(s => s.First<WillDiscardOldMessages>()) 
    .(...) 

내가 떠나 위의 IsTooOld() 메소드의 구현 당신에게 엔드 포인트에 하나의 작업자 스레드가 있다면 이것은 간단 할 것입니다. 그러나 이러한 것들의 병행 처리는 사소하지 않습니다.

의미가 있습니까?

+0

식별자 대신 메시지에 집계 루트를 저장하므로 처리기가 중앙 저장소에서 데이터를 검색 할 필요가 없습니다. 그건 아주 일반적인 관행이지? – Lybecker

+0

나는 그것을 얻는다라고 생각한다. 여러 개의 핸들러가 있어야하지만 첫 번째 핸들러에서 _old_ 메시지를 삭제해야합니다. 필터. 동일한 메시지 유형의 소비자가 여러 명일 경우 (동일한 메시지 유형을 구독하는 여러 핸들러)이 작동합니까? 메시지가 항상 각 처리기에 동시에 전달됩니까? – Lybecker

+1

"메시지가 각 처리기로 동시에 배달됩니까?" Rebus는 들어오는 메시지에 대한 핸들러 시퀀스를 가져오고 (즉,'.First ()') 사용자 지정에 따라 시퀀스를 정렬 한 다음 시퀀스를 순서대로 트래버스하고 각 메시지를 디스패치합니다. 단일 메시지를 처리 ​​할 때 병렬 처리가 필요하지 않습니다. 병렬 처리는 주어진 시간에 각각 하나의 메시지를 처리 ​​할 수있는 여러 작업자가 있어야 구현됩니다. – mookid8000

관련 문제