2011-12-21 2 views
3

私はちょうどnservicebusの調査を開始しましたが、私の特定の状況に対しては、それが適切であるか、おそらく過度のものであることがわかりません。私はちょっと苦労しています。は、このWCF MVCシナリオで役立つNServiceBusですか?

私はMVCウェブサイトとWCF RESTサービスを持っています。 "質問を投稿する"。これは、エンティティの格納、ルールエンジンによる検査、プッシュメッセージの送信、集約データの更新など、いくつかのアクションをトリガする必要があります。ルールエンジンの結果によって、新しいメッセージが作成されることもあります。これらの要件は将来変更される可能性があります。私は受信エンドポイントがリッスンしている人(誰かXが新しい質問を作成した人)にメッセージを送信する方法でこれを実装したいと思います。

私はdbテーブルにメッセージを格納し、モジュールでテーブルを監視することを考えていました。この思考プロセスはmsmqに移動し、次にnservicebusを使用してpub subに移動しました。しかし、私はこれをどのように実装すべきか分かりません。

現在、次のようなシナリオを考えています。 WCF RESTサービスに質問があります。 WCFサービスは質問を残し、新しい質問メッセージを発行します(nservicebusを何とかしておく必要がありますか?)。メッセージに登録されている私のモジュールは、通知を送信する、または定義されたルールに基づいてアクションをトリガーするなどのアクションを行います。

これは、nservicebusを使用するpubサブが私に利益をもたらすシナリオですか?そして、これは実際にそれを意図して行く方法でしょうか?

答えて

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エンドポイント(キュー)は、Webを使用して定義します。設定:

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

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

私のモジュールは

あなたの下流の加入者は、おそらく最も簡単なホスティングオプションでWindowsサービスとして実行されているNServiceBusジェネリックホスト内の各ホストすることができるメッセージテイクアクションに加入します。サブスクライバはそれぞれ、IHandleMessagesを実装するメッセージハンドラクラスを持ちます。 NServiceBusで

方法パブ/サブ作品:

  1. パブリッシャサービスは、入力キューおよびサブスクリプションの店を持っています。
  2. 加入者サービスは、起動時に、入力キュー
  3. 加入者を持っているが、出版社
  4. の入力キューへのサブスクリプション・メッセージを送信するサブスクリプションメッセージは、メッセージの加入者のタイプに興味を持っていると、加入者が含まれていますキューアドレス
  5. パブリッシャはサブスクリプションストアにサブスクリプションを記録します。
  6. パブリッシャはメッセージを受け取ります。
  7. パブリッシャーはサブスクリプションの一覧に対してメッセージの種類を評価します
  8. 見つかった各一致に対して、パブリッシャーはメッセージをキューアドレスに送信します。

NServiceBus pub-subサンプルをダウンロードして、これをよりよく理解する必要があります。

+0

これはThanxです。私は実際にパブのサブサンプル(と他のすべて)を調べましたが、私はいくつかの問題を抱えていました。投稿とユーザーとのやりとりを受け取る外部のWCFサービスとMVCサイトがある場合、両方とも同じキューのパブリッシャとして機能することができます(同じサブスクライバをトリガーします)。 – Syg

+0

これはおそらく設定することができますが、単一のサブスクライバに対して複数のパブリッシャを配置するのは間違いです。加入者の背後にあるアイデアは、あなたが単一の場所から来るビジネスイベントに興味があるということです。イベントのソースが2つある場合は、それらのイベントを受信するために別々にホストされたエンドポイントを用意する必要があります。これらのイベントを均質化して1つのソースとして公開します。 * Normalizer *のデザインパターンのようなものhttp://www.eaipatterns.com/Normalizer.html –

+0

これはよくあるシナリオですね。私は電話で注文することも、オンラインで注文することもできます。私は、1つのソースからの公開がより良いデザインであることを理解することができます。もう1つの質問:質問オブジェクトを受け取った場合は、キュー(およびIMessage)を使用してこの問題を回避するか、IDを永続化して渡す方が良いでしょうか? – Syg

2

あなたはWCFの代わりにNSBを使用し、WCFには使用しないと思います。サービスバスは、多くの新しい概念と設計を導入しています。非同期作業の考え方は従来の要求/応答とは大きく異なります。

開始するには、要求/応答の設計がボトルネックそのものになるまで、サービスバスが必要になるまで導入します。サービスバスは、アプリケーションに「ドロップイン」するだけのものではありません。既存のアプリケーションにサービスバスを導入する際には、最終的にコマンド/イベント/メッセージの処理が、即時の応答&リクエストを使用して設計されたシステムにどのように影響するかを考える必要があります。

+0

私は技術をどのように組み合わせるかについて少し苦労しています(私は見ていましたが、WCFインテグレーションサンプル)。私が持っている(概念的な)問題はこれです:ユーザーがREST(json)を使ってデバイスからメッセージを送信します。 WCFを使用してこの通信を処理し、Nservicebusを使用してキューにイベントを配置し、別のプロセスでこれを非同期に選択させるシナリオは実行可能なシナリオですか? – Syg

+0

NSBがメッセージを送信すると、NSB(同じインスタンスまたは別のインスタンス)がメッセージを受け取って処理します。あなたのMVCアプリケーションがRESTを処理できるので、なぜSCFが必要なのかは分かりません。 NSBのない私たちでさえ、WCFは雑音のように思えます。 –

+0

MVCを使用してこれらの非同期のjavascript呼び出しを処理したくないため、私はWCFを使用しています。もっと重要なのは、ネイティブの電話アプリが同じ種類のメッセージを生成するため、サービスは行く方法と思われるからです。 – Syg

2

あなたのREST APIがGETを処理していて、あなたのPUT/POST/DELETEのいくつかを "非同期"呼び出しにしたいと仮定します。ビルトインのWCF統合エンドポイントを使用することはできますが、SOAPバインディングに縛られています。あなたはRESTでハックすることができますが、本質的に2つのエンドポイントがあります.1つはGET用で、もう1つは他のものです。

NSBをブートストラップNSBをWCFに統合したのは、他の答え(HttpModuleを使用)と同じです。変更操作では、メッセージを別のエンドポイントにBus.Send()してクライアントに戻すだけです。受信エンドポイントは、必要に応じて単にメッセージを処理します。

ロジックのパイプラインが必要な場合は、それが組み込まれています。メッセージハンドラを一緒に指定することで、定義された順序で処理することができます。私はあなたが望む効果であればPub/Subは必要ないかもしれないと思っています。これにより、エンドポイントの数が減少します。エンドポイントが過負荷になると、ディストリビュータを追加することでスケールアウトすることができますが、それは別の話です。

+0

私たちはREST(およびjson)を使用するように設計しましたが、これは実際に統合エンドポイントが私たちのためには機能しないと考えた理由です。私はドキュメントを使用して、実際には違いが送信と公開の間にあるのか理解しようとしていましたが、私が得ているのは目的です:パブはすでに発生したイベントのためであり、 – Syg

+0

ドメインモデルに発行するコマンド(存在する場合)を送信します。したがって、Sendはメッセージを追加するようにシステムに指示しています。イベントはそのメッセージを追加する効果です。私は実際にはあなたが実際にPub/Subを必要としない何度も、単純なSendとパイプラインで十分であることが分かっています。 –

+0

WCFパブリッシャー設定で何か特別な処理をする必要がありますか?私のmvcアプリは現在加入者です。パブリッシャとpubサブサンプル(nservicebusホストを使用)では動作しますが、WCFサービス(msmqsubscriptionstorageを使用するglobal.asaxの標準構成)では動作しません。キューにメッセージは表示されませんか? – Syg

関連する問題