Web服务可靠消息传输简介2010-02-06 infoq Paul Fremantle罗小平介绍OASIS WS-RX技术委员会近期发布了Web服务可靠消息传输(WSRM,Web Services Reliable Messaging)1.1规范的公众预览版。作为该委员会的联值主席,我感觉有必要对WSRM及其规范做一个介绍。本文以WSRM 1.1草案四为准。WSRM规范允许两个系统实现可靠传输消息。其目标是保证消息从发送者正确传输到接收者。可靠消息传输的定义是复杂的,但不妨用Java中的JMS系统实现XML消息可靠传输类比。二者的关键区别在于,JMS是一个标准API和编程模型,它具有不同的实现和连线协议(wire-protocol)。而WSRM恰恰相反,它是一个没有规定实现API和编程模型的连线协议,是由基于SOAP的系统构成的。代理在解释连线协议之前,我想先说说WSRM与SOAP交互的适配方式。和基于队列的系统不同,WSRM对于现有应用来说是透明的。在队列系统中,总会存在一个显式的第三方队列系统,发送者放入消息,接收者再从中取出。而在RM里,客户端和服务端的SOAP处理引擎就内置处理器/代理(Handler/Agent),它们负责消息的传输。在应用层级,这些代理是不可见的,它们保证在消息丢失或未到达时重新传输消息。比如你搭建一个SOAP/JMS系统用于实现可靠的SOAP消息传输时,必须定义队列并修改Web服务中的URL。而在WSRM中就不需要这样做,因为它能自适应现有的HTTP(或其他)命名规范和URL。WSRM中逻辑上有两类代理:RMS(RM Source)和RMD(RM Destination)。在一个给定的SOAP协议栈中,二者都可以有一个或多个处理器。RMS:创建请求,终止可靠性契约。为消息添加可靠性描述头信息。若有必要,重发消息。RMD:创建响应,终止可靠性契约。接收并识别消息。(可选)丢弃重复的消息。在丢失的消息到达前,拒收顺序错乱的消息。需要强调的是,不应将RMS、RMD和客户端/请求者、服务端/响应者混为一谈。在两端可靠(请求和响应消息都能可靠传输)的环境中,无论是在客户端还是服务端,都同时存在RMS和RMD。连线协议WSRM中最重要的概念是序列(Sequence)。我们可将序列看作一个契约,在此基础上,RMS和RMD才能在发送者和接收者间实现可靠的消息传输。每个序列都有生命周期,变化范围很大。在序列中,缺省的最大消息数是2^63,相当于2.92亿年中每秒发送1000个消息!序列可通过CreateSequence创建,并用TerminateSequence终结。例如:<soap:body>
<wsrm:createsequence>
<wsrm:acksto>
<wsa:address>http://Business456.com/serviceA/789</wsa:address>
</wsrm:acksto>
</wsrm:createsequence>
</soap:body>
在序列中,每个消息都有一个在初始值上依次递增的消息编号(message number)。以下是一个序列头和消息编号的例子:<soap:header>
<wsrm:sequence>
<wsrm:identifier>http://Business456.com/RM/ABC</wsrm:identifier>
<wsrm:messagenumber>1</wsrm:messagenumber>
</wsrm:sequence>
</soap:header>
消息编号,用于在SequenceAcknowledgement头中识别消息。以下是SequenceAcknowledgement头信息例子:<soap:header>
<wsrm:sequenceacknowledgement>
<wsrm:identifier>http://Business456.com/RM/ABC</wsrm:identifier>
<wsrm:acknowledgementrange lower="1" upper="1" />
<wsrm:acknowledgementrange lower="3" upper="3" />
</wsrm:sequenceacknowledgement>
</soap:header>