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

Evaluating NServiceBus+MSMQ: Listening to two queues, is a message only processed once?

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

从理论上讲,如果我们有两个计算 units/Windows Services/etc,消息会被处理两次(可能)吗?

我们正试图了解魔法可能发生的地方,如果确实如此的话。它是在 NServiceBus 中作为 "application",还是在 RabbitMQ 中作为 "transport" 超越基本的 MSMQ。

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

每个 "compute unit"(我们称它们为 端点,尽管可以在单个物理进程边界内托管多个逻辑消息处理端点)将只监听一个队列。添加到队列的任何消息只会由侦听该队列的端点处理。

也就是说,除非您使用 Pub/Sub,在这种情况下,两个端点都可以订阅同一个事件,但是每个队列都会获得消息的副本,并且每个端点(订阅者)都会独立处理。

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

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

NServiceBus 并不是真正的应用程序。以太网络的比喻非常适用:

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