如何通过RabbitMQ中的自定义主题交换使Rebus发挥出色?

时间:2013-02-08 12:43:25

标签: rabbitmq rebus

Rebus具有灵活的系统,允许我在web.config或通过实施自定义IDetermineMessageOwnership为不同的消息类型指定不同的端点。

据我所知,消息所有权仅由字符串表示。使用MSMQ传输,此字符串指向传递消息的队列。使用RabbitMQ时,该字符串将用作消息的主题,然后将其传递到名为“Rebus”的通用交换。 Rebus是一个很好的人,因此他还使用相同的名称在RabbitMQ服务器中设置队列,并在Rebus交换中从主题到队列进行绑定

我的问题是:是否可以让Rebus 创建队列和绑定,但是仍然将消息传递给具有针对每条消息的相关主题集的交换?

手动声明队列和绑定将允许我使用带有通配符的绑定设置一个非常棒的主题交换。这是一个很好的插图,主题交换与时髦的绑定,只是为了让我的问题看起来更光滑和性感:

Illustration of topic exchange in RabbitMQ

1 个答案:

答案 0 :(得分:3)

听起来像你想做这样的事情:

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用户最常做的事情)

如果您需要更大的灵活性,您甚至可以负责决定要为每种.NET类型发布的主题,如下所示:

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

如果需要,您可以添加多个事件名称解析器 - 它们将按顺序运行,直到其中一个返回不是null的内容。

有意义吗?