Rebus 和 RabbitMQ - 使用 Rebus 的多个独立实例?
Rebus and RabbitMQ - Use multiple independent instances of Rebus?
我在我的测试环境中获得了一个 Rebus Servicebus 控制台应用程序 运行ning 作为 windows 服务。服务总线是这样创建的:
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();
应用程序设置如下所示:
<add key="RabbitMQ.Url" value="amqp://rabbitUser:password@localhost"/>
<add key="RabbitMQ.Queue" value="myFirstQueue"/>
<add key="RabbitMQ.ErrorQueue" value="myFirstQueue.error" />
如您所见,它正在与 RabbitMQ @localhost 通信。
到目前为止一切顺利,这很有魅力。
但是,我们需要在同一台服务器上设置另一个服务总线实例(它是一个测试服务器,我们在上面有多个分支)现在我 运行 遇到了一些问题。
第二个实例的应用程序设置如下所示:
<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 -> 保存到特定数据库
将消息发送到 service2 -> 保存到另一个数据库
实际发生了什么:
向 service1 发送消息 -> service1 并且 service2 接收它们并保存在两个数据库中。
有人能给我指出正确的方向吗? :)
我能够使用虚拟主机 (vhost) 解决它
在 RabbitMQ 中,我添加了两个虚拟主机,bus1 和 bus2,然后我授予用户使用它们的权限。
然后我将连接字符串更改为这个,它就像一个魅力:)
<add key="RabbitMQ.Url" value="amqp://busUser2:password@localhost/bus2"/>
从你的问题中不清楚你是 bus.Send
消息还是 bus.Publish
消息 - 但由于你在配置中调用 ManageSubscriptions()
,我假设后者.. .?
Rebus 有两种发送消息的基本方式 - 您可以 bus.Send
当您打算让一个特定的收件人收到消息时,或者您可以 bus.Publish
当您基本上不关心谁明白了 :)(当然,你 会 关心,但你让关系的订户端成为对消息类型 bus.Subscribe
足够关心的人)。
在你的情况下,在我看来你想要 bus.Send(yourMessage)
然后,在发件人的 app.config
中,你通过将类型映射到 myFirstQueue
来指定 who owns the message type ].
我希望它是有道理的:)你不需要乱搞虚拟主机和各种时髦的 Rabbit 设置来完成这项工作,它应该很容易做到,不需要任何额外的配置。
我在我的测试环境中获得了一个 Rebus Servicebus 控制台应用程序 运行ning 作为 windows 服务。服务总线是这样创建的:
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();
应用程序设置如下所示:
<add key="RabbitMQ.Url" value="amqp://rabbitUser:password@localhost"/>
<add key="RabbitMQ.Queue" value="myFirstQueue"/>
<add key="RabbitMQ.ErrorQueue" value="myFirstQueue.error" />
如您所见,它正在与 RabbitMQ @localhost 通信。
到目前为止一切顺利,这很有魅力。
但是,我们需要在同一台服务器上设置另一个服务总线实例(它是一个测试服务器,我们在上面有多个分支)现在我 运行 遇到了一些问题。
第二个实例的应用程序设置如下所示:
<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 -> 保存到特定数据库
将消息发送到 service2 -> 保存到另一个数据库
实际发生了什么:
向 service1 发送消息 -> service1 并且 service2 接收它们并保存在两个数据库中。
有人能给我指出正确的方向吗? :)
我能够使用虚拟主机 (vhost) 解决它
在 RabbitMQ 中,我添加了两个虚拟主机,bus1 和 bus2,然后我授予用户使用它们的权限。
然后我将连接字符串更改为这个,它就像一个魅力:)
<add key="RabbitMQ.Url" value="amqp://busUser2:password@localhost/bus2"/>
从你的问题中不清楚你是 bus.Send
消息还是 bus.Publish
消息 - 但由于你在配置中调用 ManageSubscriptions()
,我假设后者.. .?
Rebus 有两种发送消息的基本方式 - 您可以 bus.Send
当您打算让一个特定的收件人收到消息时,或者您可以 bus.Publish
当您基本上不关心谁明白了 :)(当然,你 会 关心,但你让关系的订户端成为对消息类型 bus.Subscribe
足够关心的人)。
在你的情况下,在我看来你想要 bus.Send(yourMessage)
然后,在发件人的 app.config
中,你通过将类型映射到 myFirstQueue
来指定 who owns the message type ].
我希望它是有道理的:)你不需要乱搞虚拟主机和各种时髦的 Rabbit 设置来完成这项工作,它应该很容易做到,不需要任何额外的配置。