背景
二十世纪九十年代中期以来,业界一直在使用DCOM和CORBA这样的面向对象的中间件平台。在分布式的应用中,中间件平台托管了大部分网络事务,比如对数据进行编码与解码以进行传送,把逻辑对象地址映射到物理传输端点,根据客户和服务器的机器架构改变数据的表示,以及按照需要自动启动服务器。
DCOM和CORBA由于自身的缺点,都没有成功占领大部分分布式计算的市场。
DCOM是Microsoft的独家解决方案,在异构网络中,各种机器运行多种操作系统,无法都使用DCOM。同时DCOM不支持创建大量数目的对象(数十万或数百万),这在很大程度上是它的分布式垃圾收集机带来的开销造成的。
虽然有多家供应商提供CORBA产品,但是没有一家供应商能够为异构网络环境中的所有操作系统环境提供实现。尽管进行了大量标准化工作,不同的CORBA实现之间仍缺乏互操作性,从而不断地造成各种问题;而且,由于供应商常常会自行定义扩展,而CORBA又缺乏针对多线程环境的规范,对于像C或C++这样的语言,源码兼容性从未完全实现过。
在异构网络环境中,让DCOM和CORBA共存不是一件容易的事情。
2002年,Microsoft推出了.NET平台取代了DCOM。
.NET提供了比DCOM更强大的分布式计算支持,但是仍然是Microsoft的独家解决方案。另一方面,CORBA技术停滞不前,许多供应商离开了市场,CORBA规范中的许多缺陷未能得到及时解决。
在DCOM 和CORBA衰败的同时,分布式计算领域的研发人员对SOAP和Web Services产生了浓厚的兴趣。SOAP 和Web Services技术一度引发了很大的公众效应,业界发表了许多论文。但是无论是在网络带宽方面,还是在CPU开销方面,SOAP都会给应用程序留下严重的性能瓶颈。应用程序可以把各种SOAP 消息拼凑在一起,但这样做极其繁琐而容易出错。Web Services的标准化进程非常缓慢,多年以来一直停留在技术层面的实现上。许多专家担心SOAP和Web Services的架构安全性。
在这样的背景下,网络通讯的中间件ICE和ACE诞生了。
ICE的全称是Internet Communications Engine,即因特网通信引擎。ICE是一款高性能的中间件,支持分布式的部署管理,消息中间件,以及网格计算等等。ICE是由ZeroC, Inc.公司开发的。
ACE的全称是ADAPTIVE Communication Environment,即自适应的通信环境。ACE自从问世以来得到了多家公司的商业支持。
ICE和ACE目前都是开放源代码的中间件。不过ICE是双License协议的:GPL和Commercial licenses,可能存在一些商业问题。
ICE的特点
- 面向对象的语义,所有的操作调用都使用迟后绑定。
- 支持同步和异步的消息传递,提供了同步和异步的操作调用和分派,提供了发布——订阅消息传递机制。
- 与硬件架构无关,客户端及服务器与底层的硬件架构屏蔽开来。对于应用代码而言,像字节序和填充这样的问题都隐藏了起来。
- 与上层的编程语言无关,客户端和服务器可以分别部署,所用语言也可以不同,支持C++、Java语言,客户端支持PHP语言。
- 与采用的操作系统无关,ICE完全是可移植的,同样的源码能够在Windows、Linux、MacOS和UNIX上编译和运行。
- 完全是线程化的,其API是线程安全的。
- 采用TCP、IP 和UDP作为传输协议,客户端和服务器代码都不需要了解底层的传输机制。
- 服务器的位置是对用户透明的,ICE例程负责定位对象,并管理底层的传输机制,比如打开和关闭连接。客户与服务器之间的交互显得像是无连接的。服务器可以迁移到不同的物理地址,而不会使客户持有的代理失效,而客户完全不知道对象实现是怎样分布在多个服务器进程上的。
- 采用SSL强加密,可以使客户和服务器完全安全地进行通信。
- 采用内建的持久机制创建持久的对象。并且提供了对高性能数据库Berkeley DB的内建支持。
ACE的特点
- ACE提供了一组丰富的可重用C++包装外观(Wrapper Facade)和框架组件,可跨多种平台完成通用的通信软件任务,其中包括:事件多路分离和事件处理器分派、信号处理、服务初始化、进程间通信、共享内存管理、消息路由、分布式服务动态(重)配置、并发执行和同步等等。
- ACE简化了使用进程间通信、事件多路分离、显式动态链接和并发的面向对象的网络应用和服务的开发。
- 增强可移植性:在ACE组件的帮助下,很容易在一种OS平台上编写并发网络应用,然后快速地将它们移植到各种其他的OS平台上。
- 更好的软件质量:ACE使用了许多可提高软件质量的关键设计模式,提供了通信软件灵活性、可扩展性、重用性和模块性。
- 更高的效率和可预测性:ACE支持广泛的应用服务质量(QoS)需求,包括延迟敏感应用的低响应等待时间、高带宽应用的高性能,以及实时应用的可预测性。
- 更容易转换到标准的高级中间件:TAO使用了ACE提供的可重用组件和模式,按照CORBA的标准实现,并且为高性能和实时系统作了优化。
- ACE包含一个高级的网络编程框架,集成并增强了较低层次的C++包装外观。
- 该框架支持将并发分布式服务动态配置进应用。
ACE的框架部分包含以下组件:
- 事件多路分离组件:ACE Reactor(反应器)和Proactor(前摄器)是可扩展的面向对象多路分离器,它们分派应用专有的处理器,以响应多种类型的基于I/O、定时器、信号和同步的事件。
- 服务初始化组件:ACE Acceptor(接受器)和Connector(连接器)组件分别使主动和被动的初始化任务与初始化一旦完成后通信服务所执行的应用专有的任务去耦合。
- 服务配置组件:ACE Service Configurator(服务配置器)支持应用的配置,这些应用的服务可在安装时或运行时被动态装配。
- 分层的流组件:ACE Stream组件简化了像用户级协议栈这样的由分层服务组成的通信软件应用的开发。
- ORB适配器组件:通过ORB适配器,ACE可以与单线程和多线程CORBA实现进行无缝集成。
比较分析
同为网络通信中间件,ICE和ACE的区别在于,前者是对通信对象的封装,例如如客户端的ICE核心和服务器端的ICE核心的不同,而后者是对通信本身的封装,例如对套接字的封装,对同步异步通信方式的封装。后者比前者更加底层,更加抽象。ACE可以认为是通用网络编程框架软件,而ICE则是一个跨平台的RPC软件。
参考文档
- Michi Henning和Mark Spruiell编写的《Distributed Programming with ICE》
- Douglas C. Schmidt编写的《C++ Network Programming with Patterns, Frameworks, and ACE》。