我们正在评估NServiceBus,主要是使用MSMQ。我们热衷于寻求可扩展性和可靠性。
从理论上讲,如果我们有两个计算单元/ Windows服务/等,那么消息会被处理两次(可能)吗?
我们试图了解魔法可能发生在哪里,如果有的话。它是在NServiceBus中作为“应用程序”,还是将RabbitMQ作为基本MSMQ之上的“传输”。
或者这是一个需要了解更多信息的愚蠢问题?
答案 0 :(得分:1)
每个“计算单元”(我们称之为端点,尽管可以在单个物理进程边界内托管多个逻辑消息处理端点)将只侦听一个队列。添加到队列的任何消息只能由侦听该队列的端点处理。
也就是说,除非您使用Pub / Sub,否则两个端点都可以订阅同一个事件,但每个队列都会得到一条消息,每个端点(订阅者)都会独立处理它。
或者,可以使用任何基于集中式代理的传输(Rabbit是其中之一 - 基本上除了MSMQ之外的任何东西)在中的同一台服务器上运行两个端点实例竞争消费者模式。在这种情况下,顾名思义,流程将竞争消息。
在RabbitMQ中,第一个端点实例将查看该消息,该消息将其从同一队列上的其他端点实例锁定,直到消息成功接收或释放以进行重试。 SQL Transport和Azure传输的工作方式类似。
NServiceBus实际上不是一个应用程序。以太网的比喻非常适用: