1.5 消息技术的分类
在具体介绍消息技术之前,让我们先对其进行分类。分类的标准有很多,而本节则按基于传输协议及基于消息传输格式两个标准来介绍。
1.5.1 基于传输协议分类
熟悉消息协议或产品(如JMS等)的读者应该知道,它们都有对不同传输协议的支持与选择,如TCP、UDP、HTTP、SSL等。也就是说,实现消息在网络上的传输,即使本书只涉及TCP/IP协议族,在传输层,也还是可以有多个选择,而本书则重点讲述两个最主要、最基本的传输协议:传输控制协议(TCP)和用户数据报协议(UDP),这便是我们的第一个分类标准:按传输协议对消息进行分类。
1.TCP消息
如果选择TCP来实现消息的发送与接收,则可称之为TCP消息。前文讲过,TCP是面向连接(Connect-Oriented)的协议,也就是说,参与通信的双方需要在数据传输之前成功建立一个连接,这是通过三次握手的过程来实现的。
也就是说,对TCP消息来说,其消息通信实现的过程应该是:建立连接—发送/接收消息—断开连接。在同一个TCP连接上,可以进行大量不同类型的消息传输,而消息体系必须考虑对这些连接进行合理有效的管理。
2.UDP消息
同样,如果选择UDP来实现消息传输,则称之为UDP消息。由于UDP是无连接(Connectionless)协议,因此,发送与接收消息的双方不必事先考虑建立连接的问题,只需要对消息进行发送与接收即可。
同时,UDP消息发送也可以选择多播(Multicast)和广播(Broadcast)的方式,即不需要必须指定消息接收方的IP,可以选择将消息同时发送给网络上的许多机器。
相比TCP消息来讲,UDP消息最明显的不同之处是:由于是无连接协议,协议层并不能保证UDP消息发送出去以后就能正确完整地被接收方收到,因此消息传输的可靠性与完整性需要在应用层设计相关机制自行保证。
但实际上,UDP消息与TCP消息的不同之处还有很多,远不止传输可靠完整这一点,下一节我们将专门讨论这个问题。
3.协议分类的比较
本节对TCP消息与UDP消息的异同点进行分析比较。
首先来看相同之处。在消息体系中,无论是TCP消息,还是UDP消息:
· 其消息的表示方法都是完全一致的。
· 提供给程序员发送与接收的API接口都应该是一致的,只是协议选择的配置有所不同而已。
再来看看不同之处。前文其实已经提到一些,下面加以总结。
· 在TCP消息传输发生之前,需要通信双方建立连接,而UDP消息则不用。
· TCP消息需要具体指定传输给哪个接收方,而UDP消息则可以以多播(Multicast)和广播(Broadcast)的方式同时发送给网络上的不同机器。
· TCP消息在协议层传输的可靠性已经被TCP协议保证,我们有充分理由相信发送成功即标志着对方接收的成功;但UDP消息则不能保证这一点,消息体系必须在协议层之上自行设计相关机制保证消息发送/接收的可靠性。这里需要指出,虽然后文可以看到TCP消息在发送后同样有等待对方回复(Response)的机制,并且对大文件的传输可能也有签名认证的设计,但这些完全都是应用层的设计,并不意味着我们不相信TCP消息发送/接收在传输层面的可靠性。
· 在协议层,由于TCP包本身要比UDP包大很多,这导致在应用开发的消息层,承载同等数据量的TCP消息的传输量要远大于UDP消息。
· 由于TCP消息需要事先建立连接,这就存在服务器对连接数的限制问题,具体来讲,这个限制与操作系统有关;而UDP消息则没有这个限制。因此,对那些消息接收方数目巨大的分布式系统(例如几万甚至几十万),应该考虑采用UDP消息。
分布式系统设计者究竟是选择TCP消息,还是选择UDP消息,应该综合考虑上述因素决定。
1.5.2 基于消息传输格式分类
基于消息传输格式的不同,可以将消息分为两大类:流消息和XML消息,前者基于二进制字节流格式传输,后者基于XML格式的字符串传输。
1.流消息
对于流消息来说,无论程序员如何表示消息,消息在真正发送之前,都需要先转换为二进制流格式,这个转换过程称为流化(Streamlization),也可称序列化(Serilization),本书统一采用“流化”一词。笔者认为,在这里用“流化”一词也更为准确,读者应该记得1.3节中介绍的那个原始消息设计的例子,那时将结构表示的实例转换成传输格式,实际上是全部转换成了字符串,那时我们称之为“序列化”,因为显然,将那种处理称为“流化”是不太合适的。
流消息是本书介绍的重点,也是用途最为广泛的一种消息机制,如JMS、CORBA、IBM MQ等,基本都是基于流消息的原理设计实现的。
2.XML消息
在XML消息机制中,程序员用XML格式表示消息内容之后,不需要再为发送传输做任何格式转换工作(不包括为安全传输所做的加密工作),直接就可以以XML字符串格式发送出去。
XML消息应用也比较广泛,如Web Service中的SOAP协议,就是基于XML消息设计实现的。
本书的第二部分会系统介绍XML消息。
3.传输格式分类的比较
下面对流消息和XML消息作比较:
· XML消息一般用于传输“函数名+参数列表”的远程服务请求;相对于XML消息来讲,流消息则适用于消息结构更为复杂的消息需求,其可以准确表达的数据类型更多、更丰富。
· 流消息更适合用于需要连续传输大数据量的需求;而XML消息则适用于小数据量的消息传输。
· 流消息不仅可以用于传输结构化数据,而且可以直接传输二进制数据,如图片、文件等;而XML消息则不能直接用于传输二进制数据(必须在传送之前自己进行某种转码工作,如base64)。
· XML消息更多地用于互联网上的数据传输,以及多层门户中Web服务与后台服务之间的数据传输。
总的来讲,流消息实现更复杂,功能更强大,适用范围更广。在实践中,用户可以根据自身需要选择使用流消息还是XML消息。