了解 MSMQ 的基础知识
Understanding the basics of MSMQ
我刚刚开始使用 MSMQ,到目前为止它看起来并不特别复杂。我已经阅读了 MSDN 上的一些文章,并且设法实现了一个将消息传递到远程机器上的私有队列的生产者和一个处理这些消息的远程机器上的消费者。没问题。
现在我只想确保在继续之前了解 MSMQ(或者我想一般的队列)的基本工作原理。
首先,有没有指定消息接收者的概念?换句话说,如果我有两个消费者轮询同一个队列,每个消费者是否只抓取队列前面的任何消息并处理它,或者生产者是否可以指定特定消息要发送给哪个消费者?我应该 Google 或在 MSDN 上查找哪些关键字以阅读更多相关信息?
其次,是否有发送消息的概念,这些消息将由所有消费者处理,而不仅仅是第一个接收到的消费者?举一个简单的例子,假设公司的接待员在她的计算机上有一个生产者,她可以用它通知公司的其他人(通过将消息推送到队列中)三明治女士已经到了。任何感兴趣的员工都将在他们的计算机上有一个消费者 运行,它将看到该消息,但不会将其删除,以便其他消费者也可以看到它。同样,我 Google 要阅读更多有关此内容的内容是什么?
最后,每个实现是否总是由一个或多个生产者和一个或多个消费者组成?如果您只有两台机器需要来回发送消息怎么办?您通常设置两个队列(A 和 B)并在机器 1 上实现队列 A 的生产者和队列 B 的消费者,而机器 2 获得队列 B 的生产者和队列 A 的消费者,或者是否有更好的方法这个?
First of all, is there a concept of specifying the recipient of a
message?
不,没有可以提供此功能的路由或其他行为。生产者和消费者完全解耦,MSMQ 不支持任何类型的条件消息出队。
...is there a concept of sending messages which are to be processed by
all consumers, not just the first one to receive?
同样,没有内置 "publisher" 功能。
...does every implementation always consist of one or more producer(s)
and one or more consumer(s)?
是的,没错。 MSMQ 仅对单向消息传递提供本机支持,因此消息交换中涉及的任何消息传递端点都需要一个队列来读取和发送到队列。按照惯例,消息交换参与者将发送到远程队列并从本地队列接收。
我猜你问的问题表明了一种期望,即排队平台应该提供多于单向的异步消息传递,但我不同意。 MSMQ 更像是一个传输层,而不是一个完全成熟的消息传递系统,但它是一个非常 solid, reliable 的基础,可以在此基础上构建您所追求的那种企业功能。
例如,WCF 围绕 MSMQ 提供了一个 request/response wrapper,它允许双向通信。
NServiceBus 为 MSMQ 带来了 request/response 和 publish/subscribe 消息模式(尽管这是高消息 volumes/scale-out 的付费产品)。
如果您想考虑其他内置了更多此类企业功能的消息传递系统(但不使用 MSMQ),您可以查看 Rabbit, or Azure Service Bus
我刚刚开始使用 MSMQ,到目前为止它看起来并不特别复杂。我已经阅读了 MSDN 上的一些文章,并且设法实现了一个将消息传递到远程机器上的私有队列的生产者和一个处理这些消息的远程机器上的消费者。没问题。
现在我只想确保在继续之前了解 MSMQ(或者我想一般的队列)的基本工作原理。
首先,有没有指定消息接收者的概念?换句话说,如果我有两个消费者轮询同一个队列,每个消费者是否只抓取队列前面的任何消息并处理它,或者生产者是否可以指定特定消息要发送给哪个消费者?我应该 Google 或在 MSDN 上查找哪些关键字以阅读更多相关信息?
其次,是否有发送消息的概念,这些消息将由所有消费者处理,而不仅仅是第一个接收到的消费者?举一个简单的例子,假设公司的接待员在她的计算机上有一个生产者,她可以用它通知公司的其他人(通过将消息推送到队列中)三明治女士已经到了。任何感兴趣的员工都将在他们的计算机上有一个消费者 运行,它将看到该消息,但不会将其删除,以便其他消费者也可以看到它。同样,我 Google 要阅读更多有关此内容的内容是什么?
最后,每个实现是否总是由一个或多个生产者和一个或多个消费者组成?如果您只有两台机器需要来回发送消息怎么办?您通常设置两个队列(A 和 B)并在机器 1 上实现队列 A 的生产者和队列 B 的消费者,而机器 2 获得队列 B 的生产者和队列 A 的消费者,或者是否有更好的方法这个?
First of all, is there a concept of specifying the recipient of a message?
不,没有可以提供此功能的路由或其他行为。生产者和消费者完全解耦,MSMQ 不支持任何类型的条件消息出队。
...is there a concept of sending messages which are to be processed by all consumers, not just the first one to receive?
同样,没有内置 "publisher" 功能。
...does every implementation always consist of one or more producer(s) and one or more consumer(s)?
是的,没错。 MSMQ 仅对单向消息传递提供本机支持,因此消息交换中涉及的任何消息传递端点都需要一个队列来读取和发送到队列。按照惯例,消息交换参与者将发送到远程队列并从本地队列接收。
我猜你问的问题表明了一种期望,即排队平台应该提供多于单向的异步消息传递,但我不同意。 MSMQ 更像是一个传输层,而不是一个完全成熟的消息传递系统,但它是一个非常 solid, reliable 的基础,可以在此基础上构建您所追求的那种企业功能。
例如,WCF 围绕 MSMQ 提供了一个 request/response wrapper,它允许双向通信。
NServiceBus 为 MSMQ 带来了 request/response 和 publish/subscribe 消息模式(尽管这是高消息 volumes/scale-out 的付费产品)。
如果您想考虑其他内置了更多此类企业功能的消息传递系统(但不使用 MSMQ),您可以查看 Rabbit, or Azure Service Bus