消息总线中的总线发现

时间:2014-05-06 07:37:04

标签: masstransit rebus

我正试图绕过消息总线和ioc,我的脑袋里充满了疑问。

这是我想到的场景

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

从病房开始,他们可以交换任何类型的信息。

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

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

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

我现在不是在讨论使用ASP.Net或任何其他任何花哨的设置。 非常感谢任何帮助

2 个答案:

答案 0 :(得分:2)

所以我不知道反叛,但我可以深入谈论MassTransit。

如果我想要一个没有互联网连接的系统能够自动注册到总线,以便它可以与同行交换消息,那么可以想到两个主要选项。

  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 *以使多播能够跨子网工作。

  4. 值得注意的是,这与IoC无关。这真的只是一个配置的事情。 MassTransit的想法是,一旦您注册了公交车,只要公交车的另一个​​成员发布到该公交车上,该消息将自动结束该消息的所有消费者。

    *注意:我很确定它不是黑色vodoo魔法,但据我所知,它是。您需要其他人的帮助才能完成这项工作。

    第二个注意:使用MSMQ,在localhost上使用ReceiveFrom队列很重要。发送到远程主机的效果非常好,但是当出现问题时,读取更难以诊断。

    第3注意:除非您要求所有同伴都注册DTC,否则我每次都会通过MSMQ推广RabbitMQ。如果这是你的要求,我祝你好运,心疼。

答案 1 :(得分: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>

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

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

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

请查看the IStoreSubscriptions wiki page了解更多信息和灵感:)

这有意义吗?

更新:我无法帮助,我不得不尝试 - 查看MessageBus sample中的Rebus samples repository - 这是我在此描述的解决方案的POC通过使用共享XML文件来存储订阅。