Rebus和RabbitMQ - 使用Rebus的多个独立实例?

时间:2015-07-07 08:05:13

标签: c# rabbitmq rebus

我在我的测试环境中运行了一个作为Windows服务运行的Rebus Servicebus控制台应用程序。 servicebus的创建方式如下:

Bus = Configure.With(adapter)
               .Logging(l => l.Log4Net())
               .Transport(
                    t => t.UseRabbitMq(ConfigurationManager.AppSettings["RabbitMQ.Url"],
                        ConfigurationManager.AppSettings["RabbitMQ.Queue"],
                        ConfigurationManager.AppSettings["RabbitMQ.ErrorQueue"])
                        .ManageSubscriptions())
               .MessageOwnership(d => d.FromRebusConfigurationSection())
               .Sagas(s => s.Use(new RavenDbSagaPersister(sagaDocumentStore)))
               .Timeouts(t => t.Use(new RavenDbTimeoutStorage(sagaDocumentStore)))
               .CreateBus().Start();

appsettings看起来像这样:

<add key="RabbitMQ.Url" value="amqp://rabbitUser:password@localhost"/>
<add key="RabbitMQ.Queue" value="myFirstQueue"/>
<add key="RabbitMQ.ErrorQueue" value="myFirstQueue.error" />

你可以看到它与RabbitMQ @localhost交谈。

到目前为止这么好,这就像一个魅力。

但是,我们需要在同一台服务器上设置另一个Servicebus实例(它是一个测试服务器,我们有多个分支机构),现在我遇到了一些问题。

第二个实例的appsettings如下所示:

<add key="RabbitMQ.Url" value="amqp://rabbitUser:password@localhost"/>
<add key="RabbitMQ.Queue" value="mySecondQueue"/>
<add key="RabbitMQ.ErrorQueue" value="mySecondQueue.error" />

当我开始向第一个服务发送消息时,我可以看到它们也被第二个服务接收,我认为这是因为他们正在使用相同的RabbitMQ实例@localhost?

我不是服务总线的专家,我认为只使用不同的队列就可以解决这个问题,但事实并非如此。

我已经阅读了有关虚拟主机的内容,这是要走的路吗?

我想做什么:

向service1发送消息 - &gt;保存到特定数据库

向service2发送消息 - &gt;保存到另一个数据库

实际发生的事情:

向service1发送消息 - &gt; service1 AND service2选择它们并保存在两个数据库中。

有人可以指出我正确的方向吗? :)

2 个答案:

答案 0 :(得分:1)

我能够使用虚拟主机(vhost)解决它

在RabbitMQ中,我添加了两个虚拟主机bus1和bus2,然后我授权用户使用它们。

然后我将connectionstring更改为this,它就像魅力一样:)

<add key="RabbitMQ.Url" value="amqp://busUser2:password@localhost/bus2"/>

答案 1 :(得分:1)

从您的问题中不清楚您是bus.Send消息还是bus.Publish消息 - 但是因为您在配置中调用ManageSubscriptions(),我会假设后者......?

Rebus有两种发送消息的基本方式 - 当你打算发送消息时,可以bus.Send,特定收件人可以获取消息,或者当你基本上不关心谁得到消息时你可以bus.Publish :)(你当然要小心,但你让关系的订阅者结束了对bus.Subscribe到消息类型足够深切的关系。)

在您的情况下,我觉得您想要bus.Send(yourMessage),然后在发件人的app.config中,您通过将类型映射到myFirstQueue来指定who owns the message type

我希望它有意义:)你不需要乱搞虚拟主机和各种时髦的Rabbit设置以使这项工作,它应该很容易做到没有任何额外的配置。