我正在尝试使用基于此体系结构的MSMQ实现可靠的WCF服务(http://www.devx.com/enterprise/Article/39015)
如果队列不可用,则消息可能会丢失(即使群集不提供零停机时间)
查看简单的订单处理工作流程
用户输入信用卡详细信息并付款
应用程序从支付网关
应用程序通过WCF MSMQ绑定向后端服务发送“即发即忘”/“单向”调用消息
用户将被重定向到“成功”页面
消息存储在REMOTE事务队列(Windows群集)
后端服务将消息出列并处理,完成复杂的订单处理工作流程,并因此向用户发送电子邮件确认
一切看起来都很好。
我无法理解我们如何保证所有“单向”呼叫都会在队列中传递? 双工通信不是一种情况,因为应尽快在结果网页上重定向用户。
想象一下,当用户收到“成功”页面时,语言“......您的付款已经完成,订单已开始处理,您稍后会通过电子邮件发送通知......”但邮件本身也会丢失。
如何为第3步实施持久性?
我可以看到的一个可能的解决方案是
3A。创建一个数据库记录,其中包含标记为未完成的事务详细信息,以获得有关该事务的任何记录。如果消息不会保存在队列中,则此记录可用作处理丢失消息的起点。
我读了这个post
有关交易MSMQ的主要理解是那里 是交易发送到a的三个不同的交易 远程队列。
- 发件人将邮件写入本地队列。
- 发件人计算机上的队列管理器通过网络将消息传输到接收方计算机上的队列管理器
- 接收方服务处理队列消息,然后从队列中删除消息。
醇>
但它没有解决所描述的问题 - 因为我知道WCF netMsmqBinding不使用本地队列向远程队列发送消息。
答案 0 :(得分:1)
但它没有解决所描述的问题 - 因为我知道WCF netMsmqBinding 不使用本地队列向远程队列发送消息。
实际上这是不正确的。无论您是否使用WCF,MSMQ 总是通过本地队列发送到远程队列。
如果您将消息发送到远程队列,那么查看服务器管理中的消息队列,您将在出站队列中看到已使用远程队列的地址创建了队列。这是一个为您自动创建的临时队列。如果远程队列由于某种原因不可用,则该消息将位于本地队列中,直到它变为可用,然后它将被传输。
因为三阶段提交,所以提供了持久性:
有些情况下您可能会丢弃消息,例如,如果您的消息处理发生在 dequeue 事务的范围之外,并且还有可能无法知道处理是否成功的情况(例如,后端Web服务调用超时),当然,您可能会有一个结构错误的消息,永远不会成功处理,但在所有情况下都应该可以设计这些消息。
如果你在集群环境中使用公共队列,那么我认为可能有更多的失败余地,因为集群msmq引入了复杂性(我没有真正使用过,所以我不知道)所以尽量避免使用。