MSMQ 事务性消息传递如何工作?

Posted

技术标签:

【中文标题】MSMQ 事务性消息传递如何工作?【英文标题】:How does MSMQ Transactional Message Delivery work? 【发布时间】:2011-11-30 20:03:47 【问题描述】:

只是想确认将消息发送到远程事务消息队列的工作原理。

假设我有两台机器,A 和 B。

机器 A 有一个用于接收消息的事务队列。 Windows 服务监视此队列并对数据进行处理(将其保存到 SQL Server)。 机器 B 正在运行一个应用程序,该应用程序需要写入机器 A 上的队列。

几个问题:

    发送消息时,是否在机器 B 上创建本地副本,然后再将其传递到机器 A? 一种。如果是这样,这是默认行为,还是仅在发送“IsRecoverable”属性时才会发生? 湾。队列是事务性的这一事实对这种行为有任何影响吗?

    由于我使用的是事务队列,事务提交后数据在哪里? 一种。它是在本地等待 msmq 服务将消息传递到远程队列吗? 湾。或者消息是否在远程机器上的队列中?

我无法解释文档。在某些地方,我看到描述了存储和转发行为,但我无法理解这是事务队列的默认行为,还是我需要明确地做一些事情来实现这一点。

【问题讨论】:

【参考方案1】:

关于事务型 MSMQ 的主要理解是,在将消息以事务方式传输到远程队列时,实际上涉及 3 个不同的事务。

    发送方将消息写入本地临时队列。 发送方计算机上的队列管理器通过线路将消息传输到接收方计算机上的队列管理器。 接收器服务处理队列消息,然后从队列中删除该消息。

所以回答你的问题:

发送消息时,是在机器 B 上创建的本地副本,之前 它会被送到机器 A 上吗?

是的

如果是这样,这种行为是默认的,还是仅在 发送“IsRecoverable”属性?

默认情况下。这就是所谓的store and forward。

队列是事务性的这一事实是否对此有任何影响 行为?

没有,除非出现故障。

由于我使用的是事务队列,因此数据在哪里? 事务提交?

这取决于您指的是哪项交易(见上文)

它是否在本地等待 msmq 服务提供 向远程队列发送消息?

仅当远程队列不可用时。

或者消息是否在远程机器上的队列中?

如果接收服务未能成功处理消息(处理程序中存在异常),则消息将保留在远程队列中。

【讨论】:

谢谢 Hugh,这很有帮助!

以上是关于MSMQ 事务性消息传递如何工作?的主要内容,如果未能解决你的问题,请参考以下文章

到 ASP 应用程序 (MVC3) 的异步消息传递(ActiveMQ、MSMQ)

进行事务处理时消息未到达 MSMQ

如何在使用 WCF 的事务性 MSMQ 中将消息显式标记为中毒

消息队列MSMQ的使用

MSMQ 消息卡在传出队列中

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