2012-09-12 4 views
0

NServiceBus를 사용하는 ASP.Net WebAPI 응용 프로그램이 있습니다. 명령은 응용 프로그램에서 NSB 호스트를 실행중인 백엔드 서버로 보내집니다. 서버는 데이터베이스와의 통신을 담당합니다.NServiceBus 응답 메시지 경고

대부분의 명령은 fire-and-forget입니다. 간단한 Bus.Send (...) 및 웹 클라이언트가 즉시 릴리스되므로 작업이 비동기 적으로 발생할 수 있습니다.

예외는 데이터베이스에 새 레코드를 만드는 명령입니다. 데이터베이스는 새로 생성 된 엔티티의 ID를 생성하는 책임이 있으며 호출자에게 다시 반환해야합니다. 이것은 호출자가 주변에 있어야하기 때문에 성능이 떨어지지 만 내 상황에서는 받아 들일만한 히트입니다.

전이중 샘플에 설명 된대로 성공적으로 Bus.Reply() 기능을 사용하고 있습니다. 새로 생성 된 ID에 대해 하나의 속성이있는 메시지로 회신 중입니다. 웹 측에서는 콜백을 Task Continuation (WebAPI의 비동기 기능 활용)에 등록하고 Bus.Send() 다음에 .Register를 사용하여 등록했습니다.

이것은 모두 정상적으로 작동합니다. 그것은 내가 원하는 것을 정확히, 매우 간단하고 쉽게 수행합니다. 유일한 문제는 다음과 같이 응답 메시지가 클라이언트가 수신 될 때마다, 그것은 경고를 기록한다는 것입니다 :

2012-09-11 16:46:44,745 [Worker.26] WARN NServiceBus.Unicast.Transport.Transactional.TransactionalTransport [(null)] - Failed raising 'transport message received' event for message with ID=1faee572-f904-4b09-b1d5-c0bd7c12738d\82936 
System.InvalidOperationException: No handlers could be found for message type: MyProject.Messages.MyEntityCreatedResponseMessage 
    at NServiceBus.Unicast.UnicastBus.HandleTransportMessage(IBuilder childBuilder, TransportMessage msg) 
    at NServiceBus.Unicast.UnicastBus.TransportMessageReceived(Object sender, TransportMessageReceivedEventArgs e) 
    at System.EventHandler`1.Invoke(Object sender, TEventArgs e) 
    at NServiceBus.Unicast.Transport.Transactional.TransactionalTransport.OnTransportMessageReceived(TransportMessage msg) 
나는이 경고를 제거하려면 어떻게

? 여기서 메시지 처리기가 필요하지 않습니다.

+0

내 머리 꼭대기에서 - 나는 더미 (빈) 처리기를 구현해야한다고 생각합니다. 그렇지 않으면 MyEntityCreatedResponseMessage 이벤트가 오류 큐 –

+0

으로 끝날 것입니다. 더미 처리기가 경고를 중지하지만 이벤트가없는 pub/sub를 수행 중이라는 경고를받습니다. 왜 .Reply가 마치 내가 한 .Publish처럼 처리됩니다 ?? –

+0

Bus.Reply 대신 Bus.Return을 사용하면 오류나 경고없이 내가했던 것을 성취 할 수 있다는 것을 알게되었습니다. 그러나 이것은 새로운 ID를 ErrorCode로 취급하고 ID가 정수로 취급되기 때문에 작동합니다. 다른 유형의 ID 나 추가 정보 (실제 오류 코드와 같은)를 전달해야한다면 작동하지 않습니다. –

답변

2

서버 또는 클라이언트 (브라우저)에 ID를 생성하는 것이 좋습니다. 그렇게하면 메시지가 계속 불이 나고 잊어 버릴 수 있으므로 아무 것도 동기화 할 필요가 없습니다.

데이터베이스 구동 ID로 유지하려는 경우 NServiceBus는 오버 헤드 만 추가합니다. 웹 사이트 코드에서 데이터베이스에 직접 대화하고 재시도를 추가 할 수 있습니다.

+0

GUID 식별자와 같은 것이 필요합니다. 가능하다면 간단한 자동 증가 정수를 사용하고 싶습니다. 버스를 통하지 않고 직접 DB에 글을 쓸 수는 있지만 나머지 아키텍처는 무시할 것이므로 그 경로를 가고 싶은지 확실하지 않습니다. 실제로, 응답 메시지에 처리기가 필요 없도록하고 싶습니다. –

+1

데이터베이스에 엔티티를 지속시키기 위해 GUID를 사용해야한다고하는 것은 없습니다. 모든 GUID는 엔티티를 유지하고 응답을 상관시키는 데 사용되는 메시지를 식별하는 데 필요합니다. 이 경우 GUID는 클라이언트에 의해 생성됩니다. – Rich

+1

@Matt에서는 전체 프로젝트 (또는 시스템)에 대해 동일한 아키텍처를 사용할 필요가 없습니다. 아키텍처가 최적의 솔루션으로 나아가고 있다면 아키텍처가 잘못된 것입니다. 동기 호출 중에 어떤 일이 일어나는지 생각해보십시오. 웹 요청이 도착하고 MSMQ 메시지로 변환되고 메시지가 처리되고 응답이 MSMQ 메시지로 변환되고 더미 메시지가 도착한 후 처리되고 회신이 웹 클라이언트로 다시 전송됩니다. 이 모든 오버 헤드는 무엇입니까? –