了解MSMQ的基础知识

时间:2015-08-28 07:57:39

标签: c# msmq

我刚开始使用MSMQ,到目前为止看起来并不是特别复杂。我已经完成了MSDN上的一些文章,并且我设法实现了一个生产者,它将消息传递到远程机器上的专用队列和处理这些消息的远程机器上的消费者。没问题。

现在我只想确保在我前进之前理解MSMQ的基本工作方式(或者我认为的一般队列)。

首先,是否有指定邮件收件人的概念?换句话说,如果我有两个消费者轮询同一个队列,那么每个消息都会抓住队列前面的任何消息并对其进行处理,还是生产者可以指定特定消息所针对的消费者?我应该在MSDN上使用哪些关键字来查找有关此内容的更多信息?

其次,是否存在发送消息的概念,这些消息将由所有消费者处理,而不仅仅是第一个接收消息?举一个简单的例子,假设公司的接待员在她的计算机上有一个制作人,她可以通过该制作人通知公司的其他人(通过推送消息到队列中)三明治女士已到达。任何感兴趣的员工都会在他们的计算机上运行一个消费者,他们会看到该消息,但不会将其删除,以便其他消费者也可以看到它。再一次,我想通过什么来阅读更多相关信息呢?

最后,每个实现是否总是由一个或多个生产者和一个或多个消费者组成?如果您只有两台机器需要向其发送消息,该怎么办?您通常设置两个队列(A和B),在机器1上为队列B实现生产者,为队列B实现消费者,而机器2获得队列B的生产者和队列A的消费者,或者有更好的方法此?

1 个答案:

答案 0 :(得分:1)

  

首先,是否存在指定a的接收者的概念   消息?

不,没有可以提供此功能的路由或其他行为。生产者和消费者完全脱钩,MSMQ不支持任何类型的条件消息出列。

  

...是否有发送要处理的消息的概念   所有消费者,不仅仅是第一个接受消费者?

同样,没有内置的"出版商"功能。

  

...每个实现总是由一个或多个生产者组成   和一个或多个消费者?

是的,这是正确的。 MSMQ仅对单向消息传递具有本机支持,因此消息交换中涉及的任何消息传递端点都需要一个队列来读取和一个要发送的队列。按照惯例,消息传递交换参与者将发送到远程队列并从本地队列接收。

我想你问的问题表明排队平台应该提供不止单向的异步消息,但我不同意。 MSMQ更像是一个传输层,而不是一个完全成熟的消息传递系统,但它是构建您所追求的企业功能的基础solid, reliable

例如,WCF在MSMQ周围提供request/response wrapper,允许双向通信。

NServiceBus为MSMQ带来了请求/响应和publish/subscribe消息传递模式(尽管这是高消息传递量/横向扩展的付费产品)。

如果您想考虑内置更多这些企业功能的其他邮件系统(但不要使用MSMQ),您可以查看RabbitAzure Service Bus