什么是 Microsoft 消息队列 (MSMQ)?它是如何工作的?

Posted

技术标签:

【中文标题】什么是 Microsoft 消息队列 (MSMQ)?它是如何工作的?【英文标题】:What is Microsoft Message Queuing (MSMQ)? How does it work? 【发布时间】:2010-09-28 20:16:34 【问题描述】:

我需要使用 MSMQ(Microsoft 消息队列)。它是什么,它是做什么用的,它是如何工作的?它与网络服务有何不同?

【问题讨论】:

【参考方案1】:

MSMQ- 微软消息队列: • MSMQ 是微软开发的消息队列实现。 • 它部署在其 Windows Server 操作系统中。 • 它是一种消息传递协议,允许在不同服务器/进程上运行的应用程序以故障安全方式进行通信。 • MSMQ 已在企业中普遍用于构建软件。 • MSMQ 将未能到达预期目的地的消息放入队列中,然后在到达目的地后重新发送它们,从而确保可靠传递。 • MSMQ 还支持事务。它允许对多个队列进行多项操作,所有操作都包装在一个事务中,从而确保所有操作都生效或都不生效。 • 消息队列 (MSMQ) 技术使在不同时间运行的应用程序能够跨异构网络和可能暂时离线的系统进行通信。 以下端口用于 Microsoft 消息队列操作: • TCP:1801 • RPC:135、2101*、2103*、2105* • UDP:3527、1801

【讨论】:

【参考方案2】:

顾名思义,它只是一个队列管理器。

您可以将对象(序列化)发送到队列中,直到您收到它们为止。 它通常用于以解耦的方式在应用程序之间发送消息或对象

这和webservices无关,它们是两个不同的东西

MSMQ 信息

https://msdn.microsoft.com/en-us/library/ms711472(v=vs.85).aspx

网络服务信息

http://msdn.microsoft.com/en-us/library/ms972326.aspx

【讨论】:

MSMQ 上的上述链接不起作用(将我重定向到一些一般信息页面),但这个 url 对我有用 msdn.microsoft.com/en-us/library/ms711472(v=vs.85).aspx【参考方案3】:

MSMQ 代表 Microsoft 消息队列。

它只是一个队列,它以格式化的方式存储消息,以便它可以传递到数据库(可能在同一台机器上或服务器上)。那里有不同类型的队列,它们对消息进行分类。如果消息内部存在一些问题/错误或传递的无效消息会自动进入死队列,这表示它没有进一步处理。但是在将消息传递到死队列之前,它会重试最大计数,直到它没有被处理然后它可以将它发送到死队列。它通常用于将日志消息从客户端机器发送到服务器或数据库,以便如果客户端机器上发生任何问题,那么开发人员或支持团队可以通过日志来解决问题。 MSMQ 是微软提供的获取 Log 文件记录的服务,使用 Log 文件轻松获取解决方案。 你可以从这个博客http://msdn.microsoft.com/en-us/library/ms711472(v=vs.85).aspx得到更好的主意

【讨论】:

【参考方案4】:

其实MSMQ和WebService没有关系。 使用 MSMQ 进行进程间通信(您还可以使用套接字、Windows 消息传递、映射内存)。 它是一个 Windows 服务,负责保存消息直到有人将它们出队。 你可以说它比套接字更可靠,因为消息存储在硬盘上,但它比其他 IPC 技术慢。

您可以通过少量代码在 dotnet 中使用 MSMQ,只需声明您的 MessageQueue 对象并调用 ReceiveSend 方法。 Message 本身可以是普通的字符串或二进制数据。

【讨论】:

【参考方案5】:

事务队列管理 101

事务队列是一种中间件系统,它在任何给定时间可能连接或不连接的主机之间异步路由另一类消息。这意味着它还必须能够在某处持久保存消息。此类系统的示例有MSMQ 和IBM MQ

事务队列也可以参与distributed transaction,回滚可以触发消息的处置。这意味着保证消息以at-most-once 语义传递,或者如果不回滚,则保证传递。如果出现以下情况,消息将不会被传递:

主机 A 发布消息,但主机 B 未连接

某事(可能但不是 必须从主机 A 发起) 回滚事务

事务完成后 B 连接 回滚

在这种情况下,B 将永远不会知道消息的存在,除非通过其他媒介通知。如果事务被回滚,这可能无关紧要。如果 B 在事务回滚之前连接并收集消息,回滚也会反转消息对 B 的影响。

请注意,A 可以将消息发布到队列并保证最多一次传递。如果事务已提交,主机 A 可以假定消息已被delivered by the reliable transport medium. 如果事务回滚,主机 A 可以假定消息的任何影响都已被逆转。

网络服务

Web 服务是由(通常)HTTP 服务器发布的remote procedure call 或其他服务(例如RESTFul API's)。它是一个同步请求/响应协议,不保证协议内置的交付。由客户端来验证服务是否已正确运行。通常,这将通过对请求的回复或呼叫超时来实现。

在后一种情况下,Web 服务不保证最多一次语义。服务器可以完成服务并且无法传递响应(可能是由于服务器外部出现问题)。应用程序必须能够处理这种情况。

IIRC,RESTFul 服务应该是幂等的(在多次调用同一服务后达到相同的状态),这是一种处理这种缺乏保证的成功/失败通知的策略Web 服务架构。 这个想法是概念上写状态而不是调用服务,因此可以写任意次数。这意味着应用程序可以容忍缺少有关成功的反馈,因为它可以重新尝试发布,直到从服务器获得“成功”消息。

【讨论】:

【参考方案6】:

正如大家所解释的,MSMQ 用作消息队列。消息可以是实际数据、对象和任何您可以序列化和通过网络发送的东西的包装器。 MSMQ 有它自己的局限性。 MSMQ 1.0 和 MSMQ 2.0 的消息限制为 4MB。 MSMQ 3.0 取消了此限制。面向消息的中间件 (MOM) 是一个严重依赖于消息传递的概念。企业服务总线基础建立在消息传递之上。所有这些新技术都依赖于消息传递来可靠地进行异步数据传输。

【讨论】:

【参考方案7】:

请注意,您可以将 Windows Communication Foundation (WCF) 用作 MSMQ 之上的抽象层。这让您有一种使用服务的感觉——只有单向操作。

有关详细信息,请参阅: http://msdn.microsoft.com/en-us/library/ms789048.aspx

--larsw

【讨论】:

【参考方案8】:

充分尊重@Juan 的回答,两者都是在两个断开连接的进程之间交换数据的方式,即进程间通信通道 (IPC)。消息队列是异步的,而 Web 服务是同步的。它们使用不同的协议和后端服务来执行此操作,因此它们的实现完全不同,但目的相似。

当其他通信进程可能不可用时,您可能希望使用消息队列,但您仍希望在客户端选择时发送消息。当另一端的进程唤醒并收到消息到达的通知时,将发生传递。

【讨论】:

感谢您的尊重 =) 我认为 MSMQ 是一种将对象从应用程序发送到应用程序的方式,而无需响应传递数据让其他应用程序执行任何操作,而 Web 服务则是“调用带有参数和结果的远程函数”,我将每个函数用于这些特定目的【参考方案9】:

Google 搜索“MSMQ”的前几个链接应该会有所帮助...

http://msdn.microsoft.com/en-us/library/ms711472(VS.85).aspx

http://www.microsoft.com/windowsserver2003/techinfo/overview/msmqfaq.mspx

http://en.wikipedia.org/wiki/Microsoft_Message_Queuing

更多信息在这里:http://www.google.com/search?q=MSMQ

【讨论】:

以上是关于什么是 Microsoft 消息队列 (MSMQ)?它是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章

MSMQ消息队列

如何在C#中使用MSMQ

为啥将消息放入死信队列 (MSMQ)?

Redis学习笔记~实现消息队列比MSMQ更方便

MSMQ(消息队列)

MSMQ。将消息正文存储在驱动器上时对其进行加密