そして、何かありますか?私にとって、MBはサブスクライバーとパブリッシャーの両方を知っており、メディエーターとして機能し、サブスクライバーに新しいメッセージを通知します(事実上「プッシュ」モデル)。一方、MQは、消費者がキューからメッセージをプルする「プル」モデルのようなものです。
私はここで完全に軌道を外れていますか?
概して、ベンダーのソフトウェア製品に関しては、それらは同じ意味で使用されており、説明したとおりプッシュまたはプルという点で強い区別はありません。
[〜#〜] bus [〜#〜]vs.[〜#〜] queue [〜# 〜]は、実際にはいくぶん古い概念であり、ごく最近ではIBM MQやTibco Rendezvousなどのシステムに由来しています。 MQはもともと1:1システムでしたが、実際はさまざまなシステムを切り離すためのキューでした。
対照的に、Tibcoはメッセージングバックボーンであり、同じトピックに関する複数のパブリッシャーとサブスクライバーを持つことができます。
しかし、両方の(およびより新しい競合製品)最近では、お互いのスペースでプレイできます。どちらも、新しいメッセージのポーリングと同様に割り込みに設定できます。両方とも、さまざまなシステム間の相互作用を仲介します。
ただしフレーズmessage-queueは、内部スレッド内メッセージポンプなどにも使用され、このコンテキストでは、実際に使用法は異なります。古典的なWindowsメッセージポンプを考えると、これは確かにあなたが説明するプルモデルですが、実際にはアプリ間またはボックス間よりもアプリ内です。
メッセージバス
メッセージバスは、異なるシステムがインターフェースの共有セット(メッセージバス)を介して通信できるようにするメッセージングインフラストラクチャです。
ソース: [〜#〜] eip [〜#〜]
メッセージキュー
メッセージキューの基本的な考え方は簡単です:
2つ(またはそれ以上)のプロセスは、一般的なシステムメッセージキューへのアクセスを介して情報を交換できます。
送信プロセスは、何らかの(OS)メッセージ受け渡しモジュールを介して、別のプロセスが読み取れるキューにメッセージを配置します
ソース: Dave Marshall
差
Message Queueには[〜#〜] fifo [〜#〜](先入れ先出し)ルールが含まれていますが、Message Busではない。
結論
両方の[〜#〜] look [〜#〜]は、同じ種類の作業を行うのが好きです-2つのアプリケーションまたはモジュールの間でメッセージを受け渡します_ orInterfacesorSystemsorProcesses、小さな違いを除くof [〜#〜] fifo [〜#〜]
一部の製品は、以前は1つまたは他のカテゴリのみに属していた機能をサポートするようになったため(たとえば、Azure Service Busは両方のアプローチをサポートします)、これら2つの概念の境界線があいまいになりました。
メッセージキューは、アプリケーションからメッセージを受信し、先入れ先出し(FIFO)方式で1つ以上の他のアプリケーションで利用できるようにします。多くのアーキテクチャシナリオで、アプリケーションAがアプリケーションBおよびCに更新またはコマンドを送信する必要がある場合、BおよびCに個別のメッセージキューを設定できます。Aは各キューに個別のメッセージを書き込み、各依存アプリケーションは独自のキュー(デキュー時に削除されるメッセージ)。 Aが更新を送信するために、BもCも利用可能である必要はありません。各メッセージキューは永続的であるため、アプリケーションを再起動すると、オンラインに戻ったときにキューからプルを開始します。これにより、依存システム間の依存関係が解消され、アプリケーションのスケーラビリティとフォールトトレランスが向上します。
メッセージバスまたはサービスバスは、1つ(または複数)のアプリケーションが1つまたは複数の他のアプリケーションとメッセージを通信する方法を提供します。先入れ先出しの順序の保証はない場合があり、バスの加入者はメッセージ送信者の知識がなくても行き来できます。したがって、メッセージバスを介してステータス更新をアプリケーションBに伝えるために、アプリケーションAを作成できます。後で、これらの更新の恩恵を受けるアプリケーションCが作成されます。アプリケーションCは、メッセージバスをリッスンし、これらの更新に基づいてアクションを実行するように構成できます。アプリケーションAを更新する必要はありません。送信アプリケーションがすべてのキューに明示的にメッセージを追加するキューとは異なり、メッセージバスはpublish /サブスクライブモデル。メッセージはバスにパブリッシュされ、その種類のメッセージをサブスクライブしたアプリケーションはそれを受信します。このアプローチにより、アプリケーションはオープン/クローズの原則に従うことができます。これは、アプリケーションが追加の変更に対してクローズされたまま、将来の変更に対してオープンになるためです。
他の回答で実際に明示的に言及されていない主な違いは、メッセージバスは複数のサブスクライバーを許可するのに対して、キューはキューをリッスンしているアイテムに対してアイテムを1つずつデキューすることです。複数のリスナーに同じアイテムがキューから出てくるのを見てもらいたい場合は、それを自分で処理する必要があります。サービスバスがすぐにこれを行います。
私が見る方法は、Message QueueがMessage Busを作成することです。クライアント(つまりノード)は、メッセージバスをリッスンできます。これは、UDPを介してMQブロードキャストメッセージを持っている場合、つまり、誰がメッセージを取得するのかを知らないか気にせずにブロードキャスト/マルチキャストアドレスにメッセージを送信している場合に特に当てはまります。このシナリオのより詳細な説明については、 この記事 を確認してください。
サービスバスは、メッセージキューよりも一般的な用語です。
MQは単純なFIFOですが、サービスバス、つまりメッセージを操作するための巨大な「センター」であるイベントハブを実装するより洗練された方法があります。 MQが提供する機能に加えて、メッセージを保存することができます(したがって、複数のサブスクライバーを使用します)。