评估NServiceBus + MSMQ:收听两个队列,是否只处理一次消息?

时间:2015-12-10 10:38:11

标签: rabbitmq nservicebus msmq

我们正在评估NServiceBus,主要是使用MSMQ。我们热衷于寻求可扩展性和可靠性。

从理论上讲,如果我们有两个计算单元/ Windows服务/等,那么消息会被处理两次(可能)吗?

我们试图了解魔法可能发生在哪里,如果有的话。它是在NServiceBus中作为“应用程序”,还是将RabbitMQ作为基本MSMQ之上的“传输”。

或者这是一个需要了解更多信息的愚蠢问题?

1 个答案:

答案 0 :(得分:1)

每个“计算单元”(我们称之为端点,尽管可以在单个物理进程边界内托管多个逻辑消息处理端点)将只侦听一个队列。添加到队列的任何消息只能由侦听该队列的端点处理。

也就是说,除非您使用Pub / Sub,否则两个端点都可以订阅同一个事件,但每个队列都会得到一条消息,每个端点(订阅者)都会独立处理它。

或者,可以使用任何基于集中式代理的传输(Rabbit是其中之一 - 基本上除了MSMQ之外的任何东西)在中的同一台服务器上运行两个端点实例竞争消费者模式。在这种情况下,顾名思义,流程将竞争消息。

在RabbitMQ中,第一个端点实例将查看该消息,该消息将其从同一队列上的其他端点实例锁定,直到消息成功接收或释放以进行重试。 SQL Transport和Azure传输的工作方式类似。

NServiceBus实际上不是一个应用程序。以太网的比喻非常适用:

  • 消息传输(MSMQ / Rabbit / etc)< =>以太网
  • NServiceBus DLL< =>以太网适配器
  • 您的邮件处理类< =>通过以太网通信的应用程序