2011-12-21 2 views
3

방금 ​​nservicebus를 조사하기 시작했고, 내 상황에 적절하거나 어쩌면 과장 할 수도 없습니다. 건축 포인터가 크게 감사 드리며, 저는 조금 고심하고 있습니다.은 NServiceBus가 유용합니까?

나는 MVC 웹 사이트와 WCF REST 서비스를 가지고있어 둘 다 메시지를 받는다. "질문 게시". 이렇게하면 엔티티 저장, 규칙 엔진에 의한 검사, 푸시 메시지 전송, 일부 집계 데이터 업데이트와 같은 여러 작업이 트리거됩니다. 규칙 엔진의 결과로 인해 새 메시지가 작성 될 수도 있습니다. 이러한 요구 사항은 앞으로 변경 될 수 있습니다. 수신 엔드 포인트가 수신 대기중인 사람 (사람 X가 새 질문을 작성한)에게 메시지를 보내는 방식으로이를 구현하고 싶습니다.

DB 테이블에 메시지를 저장하고 모듈이 테이블을 모니터링하도록 생각했습니다. 이 생각 프로세스는 msmq로 이동 한 다음 nservicebus를 사용하여 pub sub로 이동했습니다. 그러나 이것이 어떻게 구현되어야하는지 잘 모르겠습니다.

현재 다음 시나리오에 대해 생각하고 있습니다. 질문이 WCF REST 서비스에 제공됩니다. WCF 서비스는 질문을 지속하고 새로운 질문 메시지를 게시합니다 (따라서 nservicebus를 어떻게 든 호스팅해야합니까?). 메시지에 가입 한 모듈은 알림을 보내거나 정의 된 규칙을 기반으로 작업을 실행하는 등의 조치를 취합니다.

nservicebus를 사용하는 pub sub가 나에게 도움이되는 시나리오입니까? 그리고 이것이 실제로 그것을 함축하는 방법일까요?

답변

2

는 WCF 서비스는 질문을 계속하고 (그래서 어떻게 든 nservicebus 개최해야?) 새로운 질문 메시지를 게시

NServiceBus는 IIS를 포함하여 모든 관리 과정에서 호스팅 할 수

. 이렇게하려면 (WCF 서비스 내부)

  • WCF 서비스가 시작될 때 IBus 인스턴스를 만듭니다.
  • 서비스에 대한 질문 요청을 받으면 NServiceBus 메시지를 어셈블합니다.
  • IBus.Publish (MyMessage)를 사용하여 메시지를 게시합니다.

IIS에서 IBus의 인스턴스를 생성하는 일반적인 방법은 전역 asmx에서 유창한 구성을 사용하는 것입니다. 일반적인 구성은 다음과 같습니다.

public class Global : System.Web.HttpApplication 
{ 
    public static IBus Bus { get; private set; } 

    void Application_Start(object sender, EventArgs e) 
    { 
     Bus = NServiceBus.Configure.WithWeb() 
      .Log4Net() 
      .DefaultBuilder() 
      .XmlSerializer() 
      .MsmqTransport() 
       .IsTransactional(false) 
       .PurgeOnStartup(false) 
      .UnicastBus() 
       .ImpersonateSender(false) 
      .CreateBus() 
      .Start(); 
    } 

웹을 사용하여 NServiceBus 끝점 (대기열)을 정의합니다.설정 :

귀하의 다운 스트림 가입자

각 아마 가장 쉬운 호스팅 옵션 Windows 서비스로 실행하는 NServiceBus 일반적인 호스트 내부에서 호스팅 할 수있는 메시지 테이크 액션에 가입

<configSections> 
    <section name="MsmqTransportConfig" 
      type="NServiceBus.Config.MsmqTransportConfig, NServiceBus.Core" /> 
</configSections> 

<MsmqTransportConfig InputQueue="WebFrontEnd" 
        ErrorQueue="error" 
        NumberOfWorkerThreads="1" 
        MaxRetries="5" /> 

내 모듈 . 구독자는 각각 IHandleMessages을 구현하는 메시지 처리기 클래스를 갖습니다. NServiceBus에서

방법 술집/서브 작품 :

  1. 게시자 서비스는 입력 큐 및 가입 저장소가 있습니다.
  2. 가입자 서비스는 게시자의 입력 큐에 가입 메시지를 보내드립니다 스타트 업에 입력 큐
  3. 가입자를 가지고
  4. 구독 메시지는 메시지 가입자의 유형을 포함
  5. 은 및 가입자 관심 대기열 주소
  6. 게시자가 구독 저장소에 구독을 기록합니다.
  7. 게시자가 메시지를받습니다.
  8. 게시자는 구독 목록에 대해 메시지 유형을 평가합니다.
  9. 일치하는 항목마다 게시자가 메시지를 대기열 주소로 보냅니다.

이 내용을 더 잘 이해하려면 NServiceBus pub-sub 샘플을 다운로드해야합니다.

+0

고맙습니다.나는 실제로 pub 서브 샘플 (및 다른 모든 것들)을 검사했지만, 모든 부분을 제 위치에서 얻는 데 어려움을 겪고있었습니다. 게시 및 사용자 상호 작용을받는 외부 마주 보는 WCF 서비스 및 MVC 사이트를 가지고 있으면 둘 다 동일한 대기열에 게시자 역할을 할 수 있습니까 (동일한 구독자 다운 스트림을 트리거하는)? – Syg

+0

아마도 구성 할 수 있지만 단일 구독자에 대해 여러 게시자가있는 것이 좋습니다. 가입자의 아이디어는 한 곳에서 오는 비즈니스 이벤트에 관심이 있다는 것입니다. 두 가지 이벤트 소스가있는 경우 해당 이벤트를 수신하기 위해 별도로 호스트 된 엔드 포인트가 있어야하며이를 통해 이들을 균질화 한 다음 하나의 소스로 게시 할 수 있습니다. * Normalizer * 디자인 패턴과 비슷합니다. http://www.eaipatterns.com/Normalizer.html –

+0

그래도 일반적인 시나리오예요? 전화로 주문하거나 온라인으로 주문할 수 있습니까? 한 가지 출처에서 출판하는 것이 더 나은 디자인이라는 것을 이해할 수 있습니다. 한 가지 더 질문 : 질문 객체를 받으면 대기열 (및 IMessage)을 사용하여이 문제를 해결할 수 있습니까? 아니면 ID를 유지하고 전달하는 것이 좋습니다. – Syg

2

WCF 대신 NSB를 사용하고 WCF를 사용하지 않을 것이라고 생각합니다. 서비스 버스는 많은 새로운 개념과 디자인을 도입합니다. 비동기 작업의 아이디어는 전통적인 요청/응답과는 매우 다릅니다.

시작하려면 요청/응답 설계가 병목 현상 자체가 될 때까지 서비스 버스를 도입해야합니다. 서비스 버스는 응용 프로그램에 "들어가는"것이 아닙니다. 기존 애플리케이션에 서비스 버스를 도입 할 때 명령/이벤트/메시지 처리가 궁극적 인 응답 인 & 요청을 사용하여 설계된 시스템에 어떻게 영향을 미치는지 생각해야합니다.

+0

저는 실제로 기술을 결합하는 방법에 대해 조금 고심하고 있습니다 (그렇습니다. WCF Integration 샘플을 보았습니다). 내가 가진 (개념적) 문제는 다음과 같습니다. 사용자가 REST (json)를 사용하여 장치에서 메시지를 보냅니다. 그런 다음 WCF를 사용하여이 통신을 처리하고 Nservicebus를 사용하여 대기열에 이벤트를 배치 한 다음 다른 프로세스에서이를 비동기 적으로 선택하도록하는 것이 가능한 시나리오입니까? – Syg

+0

NSB가 메시지를 보내면 NSB (동일한 인스턴스 또는 다른 인스턴스)가 메시지를 선택하여 처리합니다. 귀하의 MVC 응용 프로그램이 REST를 처리 할 수 ​​있기 때문에 왜 SCF가 필요한지 알 수 없습니다. NSB가없는 우리조차도 WCF는 소음처럼 보입니다. –

+0

MVC를 사용하여 이러한 비동기 자바 스크립트 호출을 처리하고 싶지 않기 때문에 WCF를 사용하고 있습니다. 더 중요한 것은, 네이티브 전화 응용 프로그램은 동일한 유형의 메시지를 생성하므로 서비스는 갈 길과 같이 보입니다. – Syg

2

REST API가 GET을 처리한다고 가정하고 일부 PUT/POST/DELETE를 "비동기"호출로 전환하려고합니다. 기본 제공 WCF 통합 끝점을 사용할 수 있지만 SOAP 바인딩에 묶여 있습니다. REST를 해킹 할 수는 있지만 이제 GET과 다른 모든 끝 점이 본질적으로 2 개 있습니다.

우리는 다른 답변 (HttpModule 사용)과 비슷하지만 부트 스트래핑 NSB를 WCF에 통합했습니다. 변경 작업을 위해 메시지를 다른 종점에 Bus.Send()하여 클라이언트로 반환하면됩니다. 수신 엔드 포인트는 단순히 필요에 따라 메시지를 처리합니다.

논리의 파이프 라인이 필요한 경우에는 내장되어 있습니다. 정의 된 순서로 처리하기 위해 메시지 핸들러를 함께 끈으로 묶을 수 있습니다. 나는 이것이 당신이 바라는 효과라면 Pub/Sub가 전혀 필요 없다고 생각하고 있습니다. 이것은 엔드 포인트의 수를 줄입니다. 엔드 포인트에 과부하가 걸리면 디스트리뷰터를 추가하여 확장 할 수 있지만 그 또 다른 이야기입니다.

+0

우리는 REST (그리고 json)를 사용하기로 디자인 결정을 내 렸습니다. 그리고 이것은 실제로 통합 엔드 포인트가 우리를 위해 작동하지 않을 것이라고 생각한 이유입니다. 나는 문서를 사용하여 실제로 연습의 차이점을 보내고 게시하는 것을 파악하려고 시도했지만, 내가 얻는 것은 모든 것이 목적이다 : 펍은 이미 일어난 사건을위한 것이지 아직 일어나지 않은 사건에 대한 것인가? – Syg

+0

보내기는 도메인 모델 (있는 경우)에 발급하는 명령입니다. 그래서 Send는 시스템에 메시지를 추가하라고 말하고 있습니다. 이벤트는 그 메시지를 추가하는 효과가 있습니다. 실제로 여러 번 Pub/Sub를 필요로하지 않는다는 사실을 발견했습니다. 간단한 Send와 Pipeline으로 충분합니다. –

+0

WCF 게시자 구성에서 특별한 작업을 수행해야합니까? 내 mvc 앱은 현재 구독자입니다. 게시자 하위 샘플 (nservicebus 호스트 사용)에서 작동하지만 내 WCF 서비스 (msmqsubscriptionstorage를 사용하는 global.asax의 표준 구성)에서는 작동하지 않습니다. 대기열에 메시지가 표시되지 않습니까? – Syg

관련 문제