3

web.configRebusには柔軟なシステムがあり、カスタムを実装するか、実装することで、メッセージタイプごとに異なるエンドポイントを指定できますIDetermineMessageOwnership

私の知る限り、メッセージの所有権は単純に文字列で表されます。この文字列は、MSMQトランスポートを使用して、メッセージの配信先のキューを指します。RabbitMQでは、文字列がメッセージのトピックとして使用され、メッセージは「Rebus」という名前の汎用エクスチェンジに配信されます。Rebusは素晴らしい仲間なので、同じ名前を使用してRabbitMQサーバーにキューを設定し、Rebus交換内でトピックからキューへのバインディングを作成します。

私の質問はこれです:Rebusにキューとバインディングを作成せずに、各メッセージに関連するトピックが設定されたエクスチェンジにメッセージを配信することは可能ですか?

キューとバインディングを手動で宣言すると、ワイルドカードを使用したバインディングなどを使用して、すばらしいトピック交換を設定できます。これは、私の質問をより洗練されたセクシーに見せるために、ファンキーなバインディングを使用したトピック交換の素敵な図です。

RabbitMQでのトピック交換の図

4

1 に答える 1

4

あなたがこのようなことをしたいように私には思えます:

Configure.With(yourFavoriteContainer)
         .Transport(t => t.UseRabbitMq(...)
                          .ManageSubscriptions()) //< BAM!!1
         .(...)

これにより、Rebus は、Rebus がRabbitMqMessageQueue実装しているという事実を利用できます。これによりIMulticastTransport、すべてのマルチキャストの処理が Rabbit に引き継がれます。

Rabbit 対応のすべての Rebus エンドポイントが Rabbit を許可することに同意することが重要ですManageSubscriptions 。そうしないと、奇妙なことが起こる可能性があります ;)

だということだ

  • ときbus.Subscribe<SomeEvent>、タイプ名のトピックをサブスクライバーの入力キューにバインドします-たとえば"SomeEvent.SomeNamespace" -> myInputQueue
  • パブリッシャーは、タイプ名であるトピックでイベントを公開します - 例"SomeEvent.SomeNamespace"
  • サブスクライブ時にメッセージの所有権は無視されます
  • マルチキャストを行うとき、Rabbit は大変な作業を行います (これは、Rabbit ユーザーが主に行っていることです)。

さらに柔軟性が必要な場合は、次のように、.NET の種類ごとに公開するトピックを決定する責任を負うこともできます。

Configure.With(yourFavoriteContainer)
         .Transport(t => t.UseRabbitMq(...)
                          .ManageSubscriptions()
                          .AddEventNameResolver(type => DecideTopic(type))
         .(...)

必要に応じて、複数のイベント名リゾルバーを追加できます。それらのいずれかがそうでないものを返すまで、それらは順番に実行されますnull

それは理にかなっていますか?

于 2013-02-08T13:10:22.343 に答える