Asp.net 使用MSMQ和x2B提供可靠的WCF服务;订单处理web应用程序。单程呼叫传送

Asp.net 使用MSMQ和x2B提供可靠的WCF服务;订单处理web应用程序。单程呼叫传送,asp.net,wcf,msmq,Asp.net,Wcf,Msmq,我正在尝试使用基于此体系结构的MSMQ实现可靠的WCF服务() 如果队列不可用,消息可能会丢失(即使集群也不提供零停机时间) 请看一下简单的订单处理工作流 用户输入信用卡详细信息并付款 应用程序从支付网关接收成功结果 应用程序通过WCF MSMQ绑定向后端服务发送一条消息,称为“触发并忘记”/“单向”调用 用户将在“成功”页面上重定向 消息存储在远程事务队列(windows群集)中 后端服务将退出队列并处理消息,完成复杂的订单处理工作流,并因此向用户发送as电子邮件确认 除此之外,一切看起来都很

我正在尝试使用基于此体系结构的MSMQ实现可靠的WCF服务()

如果队列不可用,消息可能会丢失(即使集群也不提供零停机时间)

请看一下简单的订单处理工作流

  • 用户输入信用卡详细信息并付款

  • 应用程序从支付网关接收成功结果

  • 应用程序通过WCF MSMQ绑定向后端服务发送一条消息,称为“触发并忘记”/“单向”调用

  • 用户将在“成功”页面上重定向

  • 消息存储在远程事务队列(windows群集)中

  • 后端服务将退出队列并处理消息,完成复杂的订单处理工作流,并因此向用户发送as电子邮件确认

  • 除此之外,一切看起来都很好

    我不明白的是,我们如何保证所有“单向”呼叫都会在队列中传递? 双工通信不是一种情况,因为用户应尽快在结果网页上重定向

    想象一下,当用户收到“成功”页面时,页面的语言是“……您已付款,订单已开始处理,您稍后将发送电子邮件通知……”,但消息本身已丢失

    如何实现步骤3的耐久性

    我能看到的一个可能的解决方案是

    3a。创建一个带有标记为未完成的事务详细信息的数据库记录,以便有关于该事务的任何记录。此记录可作为处理丢失消息的起点,以防消息不会保存在队列中

    我读了这个

    关于事务性MSMQ,需要了解的主要内容是 在向客户发送的事务中是否涉及三个不同的事务 远程队列

  • 发送方将消息写入本地队列
  • 发送方机器上的队列管理器通过线路将消息传输到接收方机器上的队列管理器
  • 接收方服务处理队列消息,然后从队列中删除该消息
  • 但它并没有解决所描述的问题——我知道WCF netMsmqBinding‎ 不使用本地队列向远程队列发送消息

    但它并没有解决所描述的问题——我知道WCF netMsmqBinding‎ 不使用本地队列向远程队列发送消息

    其实这是不对的。MSMQ始终通过本地队列发送到远程队列,无论您是否使用WCF

    如果将消息发送到远程队列,则在服务器管理中的“消息队列”中查看,您将在出站队列中看到已使用远程队列的地址创建了队列。这是自动为您创建的临时队列。如果远程队列由于某种原因不可用,则消息将位于本地队列中,直到可用为止,然后将被传输

    因此,由于三阶段提交,因此提供了耐久性:

  • 事务性地在本地写入消息
  • 事务传输消息
  • 事务性地接收和处理消息
  • 有些情况下,您可能会丢弃消息,例如,如果您的消息处理发生在出列事务的范围之外,也有一些情况下,您无法知道处理是否成功(例如后端web服务调用超时),当然,您可能有一个格式错误的消息,它永远不会成功处理,但在所有情况下,都应该可以为这些消息进行设计


    如果您在集群环境中使用公共队列,那么我认为可能会有更多的失败空间,因为集群msmq引入了复杂性(我还没有真正使用过,所以我不知道),所以尽可能避免

    谢谢你的回答。如果具有非空出站队列的计算机崩溃,磁盘驱动器损坏,会发生什么情况?在这种情况下,出站队列中的所有消息都将丢失,不是吗?这是正确的。通过在另一组服务器上镜像冗余设置,可以避免这种(微小的)风险。每条消息将在两个设置上产生,并并行处理。这意味着一次失败不会导致整个处理失败。我理解这是一个很小的风险。您能更详细地解释一下“在另一组服务器上镜像冗余设置”是什么意思吗?以下是参与者-1)客户端(带出站队列的服务器);2) 具有专用队列的服务器;3) 具有从远程队列读取消息的服务的服务器(WCF服务)。应该镜像哪个进程?可以镜像尽可能多的进程。系统中的冗余越多,可用性就越高,对故障的恢复能力也就越强。我曾经在一个系统上工作过,在这个系统中,每次客户端发送一条消息时,它实际上都会发送到两个队列,然后在不同的数据中心并行处理每条消息。