はい、Rebusは実際に事実上任意の数のサブスクライバーにメッセージを公開することができます。MSMQ(少なくとも最も基本的な操作モード)が単純なポイントツーポイントチャネルであることは事実です。そのため、真のpub/subを実装するために最上位にレイヤーがあります。
それが機能する方法は、各サブスクライバーがパブリッシャーを指すエンドポイントマッピングを持ち、次に各サブスクライバーが移動することです。
bus.Subsribe<SomethingInterestingHappened>();
これにより、内部SubscriptionMessage
が発行者に送信されます。次に、発行者は、通常はこの情報をSQL Serverに保存することにより、指定された各メッセージタイプを誰がサブスクライブしたかを覚えておく必要があります。これはすべて自動的に行われ、何らかのサブスクリプションストレージを構成する必要があります。
そして、何かを出版する時が来たら、出版社は行きます
bus.Publish(new SomethingInterestingHappened { ... });
これにより、Rebusは指定されたメッセージタイプのすべてのサブスクライバーを検索します。これは0、1、またはそれ以上の場合があり、イベントは各サブスクライバーの入力キューに送信されます。
これらの詳細については、ルーティングに関するページのRebusドキュメントを参照してください。
サブスクライバーとパブリッシャーがどのように構成されているかについてのヒントを与えるために、これをチェックしてください-これはサブスクライバーです:
Configure.With(...)
.Transport(t => t.UseMsmq....)
.MessageOwnership(t => t.FromRebusConfigurationSection())
(...)
これには、一連のイベントを特定のパブリッシャーにマップするエンドポイントマッピングもあります。
<endpoints>
<add messages="SomePublisher.Messages" endpoint="publisher_input_queue" />
</endpoint>
すると、発行元は次のようになります。
Configure.With(...)
.Transport(t => t.UseMsmq....)
.Subscriptions(s => s.StoreInSqlServer(theConnectionString, "subscriptions")
.EnsureTableIsCreated())
(...)