【问题标题】:Rebus and RabbitMQ - Use multiple independent instances of Rebus?Rebus 和 RabbitMQ - 使用多个独立的 Rebus 实例?
【发布时间】:2015-07-07 08:05:12
【问题描述】:

我有一个 Rebus Servicebus 控制台应用程序在我的测试环境中作为 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 对话。

到目前为止一切顺利,这就像一个魅力。

但是,我们需要在同一台服务器上设置另一个 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 发送消息 -> 保存到特定数据库中

向 service2 发送消息 -> 保存到另一个数据库中

实际发生的情况:

向 service1 发送消息 -> service1 AND service2 将它们拾取并保存在两个数据库中。

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

【问题讨论】:

    标签: c# rabbitmq rebus


    【解决方案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 设置,它应该很容易做到,不需要任何额外的配置。

    【讨论】:

    • 我也会看看这个,现在我使用虚拟主机解决方案,因为它是一个快速修复,但这似乎是一个更清洁的解决方案:)
    【解决方案2】:

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

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

    然后我将连接字符串更改为这个,它就像一个魅力:)

    &lt;add key="RabbitMQ.Url" value="amqp://busUser2:password@localhost/bus2"/&gt;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-01
      • 2020-09-16
      相关资源
      最近更新 更多