使命必达: 深入剖析WCF的可靠会话[协议篇](上)

在《实例篇》中,我通过可靠会话实现了对图片的可靠、有序的传输;在《概念篇》中,我们对可靠消息涉及到的可靠消息传输(RM)的相关概念进行了讲述。在WS-*大家庭中,WS-RM为可靠消息传输提供了一个一个规范,使互操作成为可能。在《协议篇》中,我们侧重对WS-RM的介绍。

WS-RM,为WS-Reliable

Messaging的简称,是WS-*大家庭的一个重要成员。和前面介绍的WS-Coordination和WS-AT一样,WS-RM的制定者是结构化信息标准促进组织(OASIS:Organization
for the Advancement of Structured Information Standards)。

制定WS-RM的一个主要目的就是创建一个模块化的实现可靠详细传输(Reliable
Messaging)的机制。WS-RM定义了一种消息传输协议(Messaging
Protocol),以实现在可靠消息传输过程中对消息的识别、追踪和管理。并在此基础上,定义了SOAP绑定实现了互操作。到目前为止,WS-RM先后出了两个官方版本,即WS-RM
1.0和WS-RM 1.1。接下来对WS-RM的介绍完全基于WS-RM 1.1版本。WS-RM
1.1的命名空间为http://docs.oasis-open.org/ws-rx/wsrm/200702,你也可以直接通过命名空间表示的URL查看WS-RM官方文档。

一、 可靠消息传输模型

在本节刚刚开始的时候,我们就简单讨论了可靠消息传输需要解决的问题,或者说通过可靠消息传输可以实现的目标。概括性的说,可靠详细传输可以来实现一下三个可靠性述求:接收保障重复筛选有序交付接收保障确保从消息源发送的消息能够成功地抵达目的地;重复筛选意味着消息的接收端能够识别每一个接收到的消息,自动丢弃重复的消息;而有序交付要求消息的接收端能够完全按照消息发送的顺序上对消息进行交付

具体来说,我们可以通过如图1所示的可靠消息传输模型来说明。整个可靠消息传输体系最终是为应用服务的。如果我们将发送消息的称为应用源(Application Source),将接收消息的应用称为应用目的地(Application Destination),那么可靠消息传输题是为了确保应用源和应用目的地之前消息传输的可靠性而存在。

图1所示的可靠消息传输模型向读者展示了一个简单的消息可靠传输的流程。在消息发送端,应用源将消息发送给本地的可靠消息传输体系,即可靠消息传输源源(RM Source,以下简称RM源);RM源将消息发送到目的地;可靠消息传输目的地(RM Destination,以下简称RM目的地)接收到消息之后,会像RM源发送确认(ACK)消息,表明消息已经被成功接收;如果消息准确无误(这里主要指消息序号是否和上次交付的消息相邻),则将消息交付给应用目的地。

图1 可靠消息传输模型

TCP实现对报文段的可靠传输一样,在这依然采用消息缓存消息确认超时重传的机制提供对可靠消息传输的三个目标的实现。首先,当消息从应用源发送到RM源之后,会被赋予一个消息序号,该序号在该可靠消息传输上下文中是唯一的。RM源和目的地具有各自的消息缓冲区,或者说消息窗口对消息,用户缓存消息之用。RM源用该消息窗口存放已经发送但是尚未接收到确认的消息,我们可以将这样的消息成为状态未决消息(In-Doubt
Message);RM目的地则利用消息窗口存放成功接收但是尚未向应用目的地交付的消息。

对于某个已经发送的消息,如果在设定的超时时限内没有成功接收到相应的确认,RM源会认为该消息发送失败。此时,它会从自己的消息窗口中选择对应的消息进行重新发送。只有在成功接收到确认消息的情况下,RM源才会将消息从消息窗口中移除。

当RM目的地成功接收到消息后,如果消息的序号和上次交付消息的序号相邻,它会将消息交付给应用目的地。否则,表明之前发送出来的消息尚未抵达,此时RM目的地会将该消息放到自己的消息窗口中。只有等到之前所有的消息全部成功接收后,RM目的地采用按照消息的序号对消息实施交付,从而保证了对消息的有序交付。如果,接收到的消息序号小于已经交付的消息序号,或者等于消息窗口的某个消息的序号,RM目的地将其视为重复消息予以丢弃。

WS-RM仅仅是对消息窗口所应提供的功能进行规定,并没有对消息缓存的具体实现做出任何的限制。也就是说,我们可以采用基于内存的方式将消息缓存在当前进程的内存之中,这样可以带来更好的性能提升;我们也可以采用持久化的存储方式,将序列化后的消息存储于物理存储介质中,这样可以实现跨进行的数据共享已及程序中断后的数据恢复。前者被WCF中的可靠会话所采用。

二、从消息交换来看可靠消息传输的处理流程

上面我们通过对WS-RM采用的可靠消息传输模型进行了介绍,相信大家对基本的实现机制有了一个大致的了解。接下来,我们将目光聚焦到具体的消息交换层面,看看WS-RM采用怎样的消息交换方式提供对消息确认、超时重传的实现。不过,在这之前我们必须先介绍一个非常重要的概念:序列(Sequence)

可靠消息传输致力于对在两种终结点之间提供对接收保障、重复筛选和有序交付的实现,但是可靠消息传输具有一个执行范围。或者说,可靠消息传输的实现是基于某个上下文环境中,这相对于是一种会话(Session)的概念,这个会话在WS-RM的词汇中被称为序列。两个终结点之前能够实现可靠消息传输之前,需要先在它们之间创建一个序列,该序列为可靠消息传输提供一个执行上下文。

我们同样用TCP对报文段的可靠传输作为类比。TCP是一个完全基于连接的协议,在利用TCP进行报文传输的之前,两个TCP端点之间需要通过3次“握手”建立连接。也就是说,TCP对报文段的可靠传输是在一个确立的连接中进行的,TCP连接担当执行上下文的作用。所以,TCP连接至于TCP报文的可靠传输,就相当于序列对WS-RM可靠消息传输

通过前面的介绍,我们知道可靠消息传输机制的核心应该是“消息窗口”和“消息识别”。为了让RM源和目的地能够有效地识别每一个消息,每一个消息会被赋予一个消息序号(Message Number)。该消息序号从1开始,并在可靠消息序列这个上下文中是唯一的。

对WS-RM下的序列有了一个大致的了解之后,我们结合图5-2所示的序列图(Sequence Diagram)讨论一下WS-RM下的消息确认机制和超时重传是如何实现的。如图2所示,基于WS-RM消息交换的两个终端是Endpoint A和Endpoint B,它们分别是消息的最初发送者和最终接受者。整个过程由10个步骤完成,接下来我们来介绍一下每一个步骤具体完成怎样的工作:

步骤1-2:Endpoint
A向Endpoint B发送一个创建CreateSequence的请求,Endpoint
B创建一个全新的序列,并将序列的唯一标识(http://www.artech.com/abc)以CreateSequenceReponse的形式返回给Endpoint
A;

步骤3-5:Endpoint A连续向Endpoint
B发送3个消息,这3个消息均具有WS-RM相关的报头,主要包括序列的唯一标识和消息序列(消息序号分别文1、2和3)。为了避免频繁的网络传输,WS-RM的消息会确认机制采用一种批量确认的机制。也就是说,RM目的地对它所接收的消息并不是逐个确认的,而是将之前接收到的消息序号方式一个确认范围(Acknowledgement

Range)中,一并发送给RM源进行批量确认。反映在RM源上,如果它期望在某次消息发送后期望接收到对方的确认,就需要在该消息中插入一个AckRequested报头。步骤5中发送的第三个消息就是包含了这么一个消息报头;

步骤6:假设Endpoint B先后接收到序号为1和3个两个消息,第二个消息在传输过程中被丢弃。当接收到包含有AckRequested报头的消息之后,会向Endpoint A发送确认消息。在确认消息中的确认范围中,包括1和3;

步骤7:Endpoint A接收到确认消息后,分析确认范围中的消息序号,发现并不存在2,直到序号为2的消息发送失败。于是会从发送窗口中提取序号为2的消息,进行重传,该消息同样具有AckRequested报头,因为它期望及时接收到对重传消息的确认;

步骤8:Endpoint B成功接收到重传的序号为2的消息后,发送确认消息进行确认,需要注意的是确认范围中不仅仅包含2,还包括之前成功接收的消息序号1和3;

步骤9-10:Endpoint A接收到确认。如果此时不需要进行后续的消息交换工作,可以发送TerminateSequence消息请求终止序列,Endpoint B对序列实施终止,并返回TerminateSequence消息进行终止确认。

图2 WS-RM消息交换

作者:蒋金楠
微信公众账号:大内老A
微博:www.weibo.com/artech
如果你想及时得到个人撰写文章以及著作的消息推送,或者想看看个人推荐的技术资料,可以扫描左边二维码(或者长按识别二维码)关注个人公众号(原来公众帐号蒋金楠的自媒体将会停用)。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

原文链接

时间: 2024-09-24 10:08:33

使命必达: 深入剖析WCF的可靠会话[协议篇](上)的相关文章

使命必达: 深入剖析WCF的可靠会话[协议篇](下)

在<上篇>中,我们认识了从序列创建到终止过程中消息交换的大致流程.接下来,我们进一步将关注点聚焦到单个小消息上,看看在整个基于序列的上下文中,不同类型的消息具有怎样的结构.首先从序列的创建开始. 一.CreateSequence 和CreateSequenceReponse 基于WS-RM的可靠消息传输从序列的创建开始.为了创建序列,RM源(RM Source)向RM目的地(RM Destination)发送一个主体包含CreateSequence元素的SOAP消息.CreateSequenc

使命必达: 深入剖析WCF的可靠会话[概念篇]

在<实例篇>中,我通过可靠会话成功地进行了美女图片的传输,相信大家在保了眼福之余,会对WCF的可靠会话的功用具有一个深刻的认识.实际上,这涉及到WS中一个重要的概念--可靠消息传输(RM:Reliable Messaging).如果想对可靠会话有一个深入的认识,对可靠消息传输的了解是必须的. 一.可靠消息传输(Reliable Messaging) 我们可以将一个通过WCF构建的分布式应用划分为两个部分,即客户端应用和服务端应用,它们之间的交互方式即采用某种MEP的消息交换.在这里,我们需要通

使命必达: 深入剖析WCF的可靠会话[实例篇](内含美女图片,定力差者慎入)

通过前面一系列的博文(<WCF 并发(Concurrency)的本质>.<并发中的同步>.<实践重于理论>.<并发与实例上下文模式>.<回调与并发>.<ConcurrencyMode.Multiple 模式下的WCF服务就一定是并发执行的吗[上篇]>.<ConcurrencyMode.Multiple 模式下的WCF服务就一定是并发执行的吗[下篇]>.<控制并发访问的三道屏障[上篇]>和<控制并发访问的三

使命必达: 深入剖析WCF的可靠会话[编程篇](下)

整个可靠会话的机制是完全在信道层实现的,而整个信道层的最终缔造者就是绑定,所以可靠会话编程是围绕着绑定进行的.<上篇>对实现可靠会话的绑定元素已经如何使用系统绑定实现可靠会话进行了介绍,下篇将和你探讨WCF可靠会话编程模型余下两个主题:自定义绑定和对消息传递的强制约束. 一.为自定义绑定的可靠会话进行设置 绑定是一系列绑定元素的有序组合,但是系统绑定为我们提供适应了某种典型通信环境的绑定元素组合方式,可以看成是"套餐".但是,如果套餐不符合您的胃口,你应该查看菜单点你喜欢的

使命必达: 深入剖析WCF的可靠会话[原理揭秘篇](上)

本系列先后通过<实例篇>.<概念篇>.<协议篇>和<编程篇>对WCF的可靠会话进行了详细探讨.作为本系列的最后一片,我们将深入到WCF的可靠会话体系的最底层,对实现可靠会话的实现原理进行深入剖析.如果读者仔细阅读本系列博文,相信会使读者对可靠会话的理解提升到一定的高度. 从<编程篇>中,我们不难看出可靠会话的编程仅仅围绕着一个对象,那就是绑定.绑定在整个WCF架构模型具有重要的地位.WCF整个架构模型由两部分构成,即服务模型(Service Mo

使命必达: 深入剖析WCF的可靠会话[共8篇]

作为一个通信基础平台,WCF必须保证通信的可靠性.由于消息交换是WCF采用的通信手段,通信可靠性的保障体现在确保消息的可靠传输.WCF本质上是一个消息处理框架,作为整个消息交换系统的两个终端,即发送端和接收端.换句话说,WCF仅仅负责对消息的发送和接收,一旦消息通过WCF的信道层进入了网络,就脱离了WCF的控制范围.但是,由于网络环境的限制,网络层不能百分之百地确保对消息的有效交付.如何克服中间环节的制约,确保从一端发送的消息能够被有效地交付给另一端,这就是可靠消息传输(Reliable Mes

使命必达: 深入剖析WCF的可靠会话[原理揭秘篇](下)

上面一部分我们站在信道层的角度剖析了WCF为了实现可靠会话在信道层进行的一系列消息交换,或者说客户端和服务端的RS信道为了实现可靠消息传输所进行一轮又一轮的握手.这一切都是基于这样一个假设:两个RS信道均可以在适当的时机向对方发送消息,或者说两个RS信道之间是一个双工的通道. 如果我们站在传输层看待这个问题,该假设对于TCP传输是成立的,但是对于HTTP来说就有点问题了.HTTP本身就是一个基于请求|回复消息交换模式的应用层网络协议,并不能对双工通信提供支持.而WCF通过WSDualHttpBi

一起谈.NET技术,使命必达:深入剖析WCF的可靠会话

作为一个通信基础平台,WCF必须保证通信的可靠性.由于消息交换是WCF采用的通信手段,通信可靠性的保障体现在确保消息的可靠传输.WCF本质上是一个消息处理框架,作为整个消息交换系统的两个终端,即发送端和接收端.换句话说,WCF仅仅负责对消息的发送和接收,一旦消息通过WCF的信道层进入了网络,就脱离了WCF的控制范围.但是,由于网络环境的限制,网络层不能百分之百地确保对消息的有效交付.如何克服中间环节的制约,确保从一端发送的消息能够被有效地交付给另一端,这就是可靠消息传输(Reliable Mes

使命必达--阿里云商用消息服务MNS初探

在2015杭州云栖大会上,阿里云飞天事业部资深总监李津发布了一款海量消息,使命必达的消息服务产品(http://www.aliyun.com/product/mns).该产品能够提供高效,可靠,安全,便捷,弹性扩展的消息服务:能够帮助我们轻松的构建松耦合,高并发的分布式系统:能够方便我们做跨域数据安全传输.目前,消息服务也是阿里云唯一商用消息产品,其服务稳定性和可靠性都有SLA保障.下面让我一起来详细了解一下这款产品.   架构优势带来海量,高可靠,高可用特性 在了解消息服务前,不得不提的是阿里