1.4 消息技术的内容
上一节介绍了一种原始的消息设计,并对复杂分布式应用的消息机制进行了初步的需求分析。我们清楚地意识到:为了适应大型工业级的分布式应用开发,必须设计全面、完整的消息系统,这正是本书撰写的目的。
结合上节的需求分析,经过系统化的总结,可以将一个完整的消息系统划分为以下几个方面的内容来介绍。
1.消息的表示
正如在上节原始的消息设计中采用一个结构(struct)来表示消息一样,完整的消息体系首先要解决的正是消息的表示方法问题,即如何将我们需要通过消息传递的信息(包括各种类型的数据以及远程调用的请求),合理、准确、全面地组织并表达出来?
2.消息传输表示的生成解析
在上一节的示例程序中,socket发送函数调用之前,首先,定义一个足够大的缓冲区;接着,为了让接收程序知道需要接收多少字节,在该缓冲区(buffer)的头部,写入该消息包括实际数据的总字节数;然后将存储人信息的结构实例中的每一个元素按照预定的规则依次写入一个足够大的缓冲区(buffer)中,而接收方接收时,则按照发送时的顺序取得所需要的数据,并创建新的结构实例。这就是消息的传输格式表示的生成与解析过程,在前面的例子中则是序列化/反序列化的过程。我们要介绍的完整消息体系也同样需要具有这样的内容,只是实现过程要复杂得多。
3.单消息的发送与接收
一个消息的发送与接收过程在网络协议底层是如何处理的,这包括不同数据元素、不同数据类型、平台无关、加解密处理和传输控制等问题,我们称之为“单消息”的发送与接收问题。在上节原始消息设计的例子中,就涉及了该项内容的部分要素,但是只有通信双方以事先协议格式发送/接收多少字节这一个简单问题。
4.消息管理
消息管理是指什么呢?与前三点不同的是,上一节的原始消息设计中,并没有明显看到该方面的内容。但这里要指出,消息管理是消息体系中最重要的内容之一。正如前文对原始消息设计不足之处的分析中提到的那样,消息何时创建、如何创建、何时消亡?不同类型的消息如何管理?大量的消息如何存储、如何有效获取、如何有效发送与接收?同时来自许多不同发送方的消息、如何处理?消息的版本变化后如何兼容?消息的数据内容处理与远程调用请求处理如何协调?所有这些,都是消息管理机制应该解决的问题。
对TCP流消息来讲,消息的管理机制其实还分为单TCP连接上的消息管理机制和多TCP连接上的消息管理机制,而这两者是相辅相成、共同存在的,并不是后者包含前者的关系。准确地讲,单TCP连接上“消息管理”的管理对象主要是该连接上发送与接收的消息本身,而多TCP连接上消息管理的对象则包括TCP连接本身、各连接公有的消息队列及并发机制。
读者也许会问,上一点“单消息的发送与接收”内容中不是已经提到消息的发送/接收了吗,怎么这里还要讲呢?其实,“消息管理”涉及的发送/接收,主要包括不同类型、大数量、多连接的消息发送/接收协调处理(包括同步、异步消息)和一个消息发送/接收时较高层面的分步处理(后文会具体介绍到底高到什么层面)这两个方面的内容,而“单消息的发送与接收”内容提到的发送与接收,则是指一个消息在网络协议底层是如何处理的。
5.消息的请求处理
现在我们知道,通信一方在其不断接收到的消息中,有不同类型的消息,有来自于不同发送源的消息。而这里我们关心的问题是:有相当一部分消息不是以传输数据为目的,而是为了实现远程过程调用的功能,这也是分布式应用开发中的重要内容:远程调用请求在消息体中如何处理?参数如何传递?众多不同类型的请求如何组织、管理?远程调用如何实现执行?众多请求如何能互不影响?所有这些问题,都不简单,需要专门研究。
6.消息并发
消息并发有两种情况:一种是指同一个TCP连接上的多进程/多线程并发,另一种是指多TCP连接上的并发,而只有后一种才是真正意义上的并发,也正是我们的主要研究对象,其实也就是指多TCP连接上消息管理的内容。无论是发送还是接收,无论是只有两个独立应用参与还是有更多的应用参与,并发处理是必须考虑的,它其实已经存在于上面提到的所有内容中。但由于并发处理的复杂性与重要性,远比我们想象的要复杂得多,因此该项内容实质上可以自成体系,完全有必要专门介绍消息体系中的并发处理机制。
7.消息制造
所谓消息制造,是指如何制作各种类型的消息体模板,而不是指编码过程中对某一类型消息的实例化过程。这即是对“消息表示法”一项内容的具体化过程。在基于消息的分布式开发中,当需要应对一种新的通信需求时,首先要做的便是定义一种新的消息类型。然而,如何才能快速、安全定义并生成一种新的消息?这是该项内容需要解决的问题。后面我们会知道,对我们本书介绍的流消息机制来说,当消息体系建立起来以后,该环节是留给程序员的唯一不安全的地方;而XML消息机制中介绍的消息制造方法,则具有更加广泛灵活的可扩充性。
总的来讲,一个完整的消息系统主要包括以上几项内容,只有全面、合理、高效、稳定地设计与实现以上内容,才能拥有一个合格的消息体系。而这些正是本书的主要内容。当然,本书内容中还有一些关于消息本地化、消息版本管理等方面的内容,它们在一个消息体系的设计开发中,也是需要考虑的。