评估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 <=> 以太网适配器
- 您的消息处理类 <=> 通过以太网通信的应用程序
我们正在评估 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 <=> 以太网适配器
- 您的消息处理类 <=> 通过以太网通信的应用程序