26

最近、私は分散型メッセージングとそれに関連するパターンについて多くのことを読んでいます。たとえばNServiceBusなどのツールでサポートされているものをいくつか使用しました。

それらのパターンの多くは、インターネット上で説明されています。私が最近読んだそれらのいくつかは次のとおりです。

NService バスなどのツールを使用すると、インフラストラクチャの問題についてあまり考えずに多くのことを実行できる場合、基本的なメッセージ バスとコマンド ハンドラーを実装しようとしたときに、いくつかの疑問が生じました。実際、これらのパターンに関しては、それらの間に多くの違いは見られません。

長いのでコードは貼りませんが、私が話したい実装のアイデアをよく説明している 2 つのブログ投稿を見つけました。

アイデアは単純です。メッセージ バスはサブスクライバーを追跡し、関心があれば別のサブスクライバーにメッセージをディスパッチします。

メッセージバスによく似ています。コマンド バスは、特定のコマンド タイプのコマンド ハンドラを呼び出します。

したがって、どちらの場合も類似点があります。

あるパターンを別のパターンと使用した場合の実際の違いと利点は何ですか (ツールのサポートについて話しているのではありません)。何が欠けていますか?

2番目の質問はです。サポートツールなしでメッセージバスは価値がありますか? すべてのテナントへのサポートを単独で推進するつもりはありません。

長くて紛らわしい質問で申し訳ありませんが、詳細については遠慮なくお尋ねください。

4

2 に答える 2

45

うわー、あなたがリンクしたMSDNよりも完全で信頼できる答えを出すのは難しいので、もっと簡潔にしましょう.

メッセージバスは通信に関係しています。配信される通信がコマンドであるかどうかも必要ありません。また、ペイロードが何であるかは気にしません。「型にとらわれない」です。メッセージ バスの主な関心事は、各通信 (pub/sub) を誰が取得する必要があるかを追跡することです。このモデルの利点は、まだ仕様がない将来の拡張をサポートすることです。今後、新しいメッセージ タイプを追加する可能性がありますが、このモデルは喜んでそれを提供します。メッセージ バスは、アプリケーションの外部に分散される可能性が高く、おそらくマシンの外部にも分散されます (たとえば、10 台のサーバーのクラスター間で分散されます)。

コマンド ハンドラー モデルは、コマンドの実行からアクションを分離することに関係しています。伝統的に (少なくとも私が使用している言語では)、コマンドは UI コントロールとそのイベント、および UI スレッドと非常に密接に関連付けられていました。この古いモデルでは、アプリケーションで使用可能なコマンドの範囲をカスタマイズまたは拡張することも困難でした (たとえば、拡張 DLL を使用)。コマンド ハンドラー モデルは、UI とコマンド実行の懸念事項を分離します。コマンド ハンドラーを簡単に追加し、UI イベントなしでコマンドを実行できる柔軟性があります (単体テスト可能)。)。これにより、よりクリーンでモジュール化されたテスト可能なコードが作成されます。コマンド ハンドラーは、内部的にアプリケーションの一部である可能性が高くなります。コマンド コレクションの拡張機能は、複数のアプリケーションではなく、1 つのアプリケーションに影響を与えることを意図している可能性があります。

メッセージ/コマンド ブローカは、互換性のない、または異なる設計の独立したシステムの接続に関係しています。これは、1 つのアプリケーションを別のアプリケーションと連携させ、一方または両方のアプリケーションのソース コードを持たない場合のユース ケースです。したがって、一方から情報を受け取り、他方でこの情報を提供するブローカーを作成し、これら 2 つのアプリが通信するために必要な変換を考慮します。MSDN の例は、支払い処理業者、運送会社、および会計システムと通信する必要がある可能性のある e コマース Web サイトです。これらのアプリ (e コマース システムを含む) のソース コードを変更できない場合があります。おそらく、e コマース システムには IExamplePaymentGateway インターフェイスが必要であり、支払いプロバイダーには IDifferentPaymentAPI インターフェイスが必要です。1 つの API が XML で実装され、もう 1 つの API が JSON で実装されているのではないでしょうか? 違いが何であれ、ブローカーは接続を可能にする責任があります。

ご覧のとおり、それらはすべて何らかの方法で通信する必要があります。それらの間の線はぼやけている可能性があり、これらのパターンのいくつかを組み合わせて使用​​して、特定のユースケースを実現することもできます.

私は NServiceBus を使用したことはありませんが、これらのタイプのライブラリのほとんどは、抽象的/学術的モデルをより具体的な言語固有の実装にラップしようとするだけです。これにより時間を節約できる場合もあれば、不明なオープンソースの貢献者による貧弱な実装に行き詰まる場合もあります。独自のユースケースと、好みの開発言語で利用できるツールの適合性を評価する必要があります。

于 2011-12-08T16:54:27.387 に答える