我正在尝试基于此架构(http://www.devx.com/enterprise/Article/39015)使用 MSMQ 实现可靠的 WCF 服务
如果队列不可用,则消息可能会丢失(即使集群不提供零停机时间)
看看简单的订单处理工作流程
用户输入信用卡详细信息并付款
应用程序从支付网关收到成功结果
应用程序通过 WCF MSMQ 绑定将消息作为“即发即弃”/“单向”调用发送到后端服务
用户将被重定向到“成功”页面
消息存储在远程事务队列中(Windows 集群)
后端服务出列并处理消息,完成复杂的订单处理工作流程,并因此向用户发送电子邮件确认
除了例外,一切看起来都很好。
我无法理解我们如何保证所有“单向”呼叫都将在队列中传递?双工通信不是一种情况,因为用户应尽快在结果网页上重定向。
想象一下这样的情况,当用户收到“成功”页面,其中的语言是“......您的付款已完成,订单已开始处理,您稍后将通过电子邮件发送通知......”但消息本身丢失了。
第 3 步如何实现持久性?
我可以看到的可能解决方案之一是
3a。创建一个带有标记为未完成的交易详细信息的数据库记录,以获取有关该交易的任何记录。该记录可以作为处理丢失消息的起点,以防消息不会保存在队列中。
我读了这篇文章
关于事务性 MSMQ,主要需要了解的是,在向远程队列的事务性发送中涉及三个不同的事务。
- 发送者将消息写入本地队列。
- 发送方机器上的队列管理器通过线路将消息传输到接收方机器上的队列管理器
- 接收者服务处理队列消息,然后从队列中删除消息。
但这并不能解决所描述的问题-据我所知,WCF netMsmqBinding 不使用本地队列将消息发送到远程队列。