3

Rebus 具有灵活的系统,允许我为不同的消息类型指定不同的端点,无论是在web.config自定义的IDetermineMessageOwnership.

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

我的问题是:是否可以让 Rebus创建队列和绑定,但仍将消息传递到为每条消息设置相关主题的交换器?

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

RabbitMQ中的话题交换图解

4

1 回答 1

4

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

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

这让 Rebus 可以利用 RebusRabbitMqMessageQueue实现的事实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 回答