3

我试图让我的头脑围绕消息总线和国际奥委会,但我的头脑中充满了问题。

这是我想到的场景

三台电脑通过局域网连接,无法上网。三台计算机各有一个服务,运行并自动发现其他计算机,换句话说,它们各自在公共总线上发送消息??这表明了自己。

从那时起,他们可以交换任何类型的消息。

这在第一个实例中是否可能仅使用消息总线架构?

如果是,自我发现位将如何工作?我看到的所有示例似乎都是特定于机器的本地队列。我似乎找不到远程队列发送消息或完成自我发现的示例。

我在 .Net 中有一个使用 rebus 的本地服务,但现在希望了解这个难题的缺失部分。

我现在不是在谈论使用 ASP.Net 或任何东西的任何花哨的设置。任何帮助是极大的赞赏

4

2 回答 2

2

使用 Rebus,您可以轻松实现您所描述的行为,方法是让所有三个服务端点共享相同的订阅存储,例如中央 SQL Server/MongoDB/RavenDB/PostgreSQL 数据库,然后让每个订阅者通过自己订阅来建立订阅.

为了订阅自己,端点必须是所有消息类型的所有者,例如通过在 app.config 中具有以下 Rebus XML:

<configSections>
    <section name="rebus" type="Rebus.Configuration.RebusConfigurationSection, Rebus" />
</configSections>

<rebus inputQueue="myOwnInputQueue" errorQueue="sharedErrorQueue@anotherMachine">
    <add messages="SomeMessageAssembly" endpoint="myOwnInputQueue"/>
</rebus>

这样,每个端点只需要执行 abus.Subscribe<SomeMessage>()即可注册为该特定消息类型的订阅者,并且从那时起SomeMessage,无论哪个端点发布它,它都将处理所有已发布的 s(注意:包括它自己!)

如果端点需要按谁发送它来过滤传入消息,它可以检查rebus-return-address标头以便例如忽略它自己发布的消息。

如果您想以上述数据库选项之外的其他方式集中您的订阅存储,您可以使用您自己的实现,IStoreSubscriptions将订阅存储在其他地方或使用其他逻辑来决定谁接收给定类型的消息。

查看IStoreSubscriptions wiki 页面以获取更多信息和灵感 :)

那有意义吗?

更新:我忍不住了,我不得不尝试 - 查看Rebus 示例存储库中的MessageBus 示例- 这是我在此处描述的解决方案的 POC,它使用共享 XML 文件来存储订阅。

于 2014-05-09T20:34:25.387 回答
2

所以我不知道rebus,但我可以深入谈谈MassTransit。

如果我想要一个没有 Internet 连接的系统能够自动注册到总线上以便它可以与它的对等方交换消息,那么我想到了两个主要选项。

  1. RabbitMQ 或 MSMQ 有一个已知的中心位置,每个实例都连接到该位置。使用 RabbitMQ,每个人都使用 RabbitMQ 实例很简单,例如将 rabbitmq://10.0.0.10/my_queue 作为ReceiveFrom配置中的地址。对于 MSMQ,订阅服务队列位置将是 msmq://10.0.0.10/mt_subscriptions。那么ReceiveFrom队列应该是 msmq://localhost/my_queue。一旦总线共享一个中心位置,那么所有对等点都可以通信。

  2. 拥有“双总线”系统。首先使用 MSMQ 的多播进行发现。基本上每分钟左右广播一条消息,直到找到中央服务器,然后启动另一条总线,如#1,但使用多播总线提供的地址。如果您使用 RabbitMQ,则意味着混合使用 RabbitMQ 和 MSMQ 总线。

  3. 第三种,但不是很好,可能性就是使用 MSMQ 的多播订阅客户端。这并不完美,因为多播不是为生产使用而设计的。但是,如果权衡是可以接受的,那么您可以使用它。MSMQ 多播在服务开始执行和订阅完全协商之间存在启动滞后。如果您立即开始发布,这可能会导致消息丢失。多播需要同一子网中的所有机器或使用您的路由器返回 vodoo magic* 以使多播跨子网工作。

值得注意的是,目前这与 IoC 无关。这实际上只是一个配置问题。MassTransit 的想法是,一旦您注册了一辆公共汽车,只要公共汽车的另一个​​成员向它发布信息 - 该消息将自动结束该消息的所有消费者。

*注意:我很确定这不是黑巫术,但就我而言,它是。您需要其他人的帮助才能完成这项工作。

第二个注意事项:对于 MSMQ,使用ReceiveFrom本地主机上的队列很重要。发送到远程主机效果很好,但是当出现问题时,读取数据就更难诊断了。

第三注意:我每次都会在 MSMQ 上推广 RabbitMQ,除非您要求所有对等方都注册 DTC。如果这是你的要求,我祝你好运,心痛。

于 2014-05-06T13:34:46.720 回答