一、概述
随着Internet的不断壮大,分布计算技术越来越受到人们的重视并得到了快速的发展,逐步形成了基于过程的分布计算技术、基于对象的分布计算技术和基于Code-on-demand的分布计算技术等几种主流技术。而Mobile Agent的出现,即作为一种未来的分布计算模式受到了各有关研究人员的重视并逐步成为当今计算机技术研究的热点之一。[1]但是,在基于Mobile Agent分布计算技术的研究方面,由于理解不同、缺乏相关的标准和规范作为有力的指导,不同的研究机构在研究内容、指导理论和研究方法上都还存在很大的差异。笔者使用了由日本三菱公司开发的Concordia软件包,觉得是目前一个比较有代表性的Mobile Agent系统,现分析其体系结构及其迁移的实现如下。
一般情况下,一个Mobile Agent 系统至少应该包含Mobile Agent和Mobile Agent Server两部分。Mobile Agent通过Mobile Agent server实现其在网络上的移动和相应动作;而Mobile Agent server为Mobile Agent 的移动和执行提供必要的执行环境以及相应的发射、接受、恢复、安全管理和服务调用等功能或服务。为了确保Mobile Agent能够顺利地在网络上迁移并完成相应的功能,Mobile Agent Server至少应能够为Mobile Agent提供以下几个主要的服务:
1 生命周期管理:即为Mobile Agent的创建、发送、传输、接收和执行等提供必要的条件;
2 目录服务:提供统一的命名服务,使得Agent能够在网络上准确地找到所需的服务并加以利用;
3 事件服务:为Agent提供一种通讯机制,使得能够和其它Agent或应用系统进行交互,为Agent之间的相互协作提供必要的条件;
4 持续性服务:通过相应的机制确保Agent执行的持续性。使得Agent在到达目的地之后或者出现系统、网络崩溃等意外时,能够准确地重新启动;
5 安全保障:利用多种途径保障整个系统的安全,包括Agent的安全、服务器的安全等。
二、Concordia体系结构
Concordia是一个基于Java语言、能够高效开发和管理各种Mobile Agent 应用的完整框架,它基本上包括了上述的所有特性。该框架中包含了若干以Java语言完成的部件,这些组件能相互结合,为Mobile Agent 应用的开发和管理提供完美的环境。Concordia的体系结构如图一所示,图中各部件的主要功能和职责如下:[2]
管理员:它主要负责整个Concordia网络的管理。它管理着Concordia 所提供的所有服务,并能与这些服务协同javascript:tagshow(event, '%B9%A4%D7%F7');" href="javascript:;" target=_self>工作。对它的操作主要通过其用户界面来完成。
Concordia服务器:是安装并运行在网络各Concordia 节点上所有构件的总称。在Concordia 中,一个Mobile Agent 系统至少应该包括一个Java虚拟机(JVM),一个Concordia Server和一个Mobile Agent。一般情况下,Mobile Agent系统都会有多个Concordia Server同时运行在网络的不同节点上。Concordia Server主要包含以下几个构件:
Agent管理器:它为Agent在网络上的传送和接收提供了必要的基础设施;管理着Agent的生命周期,为Agent的执行提供一个完整的环境。其主要功能有以下几点:
l 提供最基本的迁移功能:使得Agent的代码和数据总是能够准确的到达其目的地;
2 为Agent的执行提供了相应的执行环境;
3 为Agent的远程管理提供支持;
4 为Agent 改变其路线提供了相应的方法。
队列管理器:它负责Concordia系统中Agent的时序安排和可能重试的行为。包括在Agent等待时机以完成工作时对它们进行维护,在Agent进入或离开系统时维持它们的持续性状态,并在Concordia系统从网络中断开时进行必要的重试。它为Agent登陆到Concordia节点后的执行提供了排序和管理的机制。其主要任务包括:
l 为Agent在不可靠网络之上提供可靠的传输;
2 提供基本的存储和转发操作。
持续性管理器;它维持着Agent在网络上迁移时的状态。而且,它考虑到了在系统失败情况下Agent的检查点和再启动(由于程序或系统故障,一个程序被终止以后,使它在某个中间位置而不是在开始位置重新开始执行的一种程序。一次再启动可以在检查点开始或从一个作业步开始,并且使用检查点记录以便重新将系统初始化)。其操作在一般情况下都是透明的,也就是说,根本无须Agent或者Administrator的控制。其包括的主要功能有:
l 为Agent和其他一些Object的持续性提供必要的支持;
2 使得系统在崩溃之后的重新启动中能够准确地重新启动Agent和各种服务。
事件管理器:它管理着发送给Agent或从Agent发出的注册和通知等事件。它能够在Concordia网络上把事件传递给网络中其他节点上的Agent,它和Concordia一起根据需要发布事件。其主要功能有:
l 为Agent之间的协作提供相应支持;
2 为Agent之间的事件传送提供支持;
3 实现事件的多点传送,即多个接收者接受一个事件。
目录管理器:它的主要责任是提供统一的命名服务,使得Agent能够在网络上找到所需的服务。Administrator可以根据设计人员或者服务的需要以多种途径来设定名字服务。
安全管理器:它负责识别用户,鉴别他们的Agent,保护服务器的资源并确保Agent及其数据对象在迁移中的安全和完整。它也负责控制Agent对其所需Java类库的动态加载。它拥有一个用户界面构件,能够通过该界面来配置和监控Concordia所知的各用户和服务的安全属性。其关键功能包括:
l 执行相应的鉴定:确保能够识别出Agent来自何处以及到底是谁在执行它;
2 执行访问控制:确保服务器的资源不受恶意的或者错误Agent的攻击;
3 加密:防止Agent被假冒和篡改。
服务接口(Service Bridge):它为开发人员提供了一种机制,使得开发出来的Agent在迁移到某一个服务器时,能够在该服务器增加一些有关的服务,为Agent的执行提供有效的支持,这些增加的服务可以在DirectoryManager上完成相应的注册。它的一个最主要的用途就是使得Agent能够访问目的服务器上的各种本地服务。它可以通过远程管理API来执行远程的管理。
除此之外,Concordia还为开发人员提供了大量开发Agent 的应用所需的类库(Agent tools Library),使得Agent的设计人员无须过多了解网络的细节和编制相关的代码,极大的方便了开发人员。
三、Concordile中Mobile Agent的迁移
Mobile Agent的迁移与分布式对象的交互及Java Applet的下载有着很大的不同。在基于CORBA或DCOM的分布式对象系统中,一个对象能够通过网络远程地调用其他对象的方法。但是,在两个对象的交互过程,没有任何一个是移动的。WWW中Applet的下载也仅是提供了一种从Web服务器把代码下载到Web浏览器的机制,并没有为相应状态信息的迁移提供任何机制。可以说一个Applet本质上并不是从服务器上迁移到浏览器上的,而仅仅是代码的下载,就象HTML页面的下载一样,因为下载的代码将创建一个对象,一旦该Applet被创建,它就只能呆在该浏览器上而不能移动。而Mobile Agent的迁移则不同,它在迁移的过程中不但携带着相应的代码,也将携带着有关的状态信息,如图二所示[3],另外,Mobile Agent还能根据用户的要求在网络上进行多次迁移。
在Mobile Agent的迁移过程中,其迁移计划是由路线来决定的。例如表1就定义了一个Mobile Agent的路线。根据该路线,该Mobile Agent将首先到达服务器Server1,在该服务器上执行方法method1;然后迁移到服务器Server2并执行方法method2;最后迁移到服务器Server3,执行方法method3。
在Concordia中,路线是一个完全独立于Mobile Agent的数据结构,在Mobile Agent的执行过程中,将在一个相对独立的地方对该Mobile Agent的迁移进行管理。这种模式能够为Mobile Agent迁移的定义和跟踪提供十分简单的机制。而且,系统还能够允许Mobile Agent在执行过程中更改它们的路线,从而大大提高了灵活度。
Agent的源代码 迁移中的Agent
表1 某Mobile Agent 的路线
另外,在Mobile Agent的迁移过程中还有可能遇到这种情况:即Mobile Agent迁移到某主机后发现它需要使用的一些相关类在该主机上并不存在。为了解决这个问题,Concordia使用了一种Push-Pull的方式来移动相应的代码。
Concordia的Pull模式和浏览器下载Applet代码的方式比较相似。在这种模式中,Mobile Agent在迁移过程中将携带一个其出发地的代码基地(codebase),一般情况下,这个代码基地将是一个Web服务器上的某个位置。当一台主机的Concordia服务器发现某一个 Agent所需要的代码在该主机上不存在时,它就向该 Agent的代码基地发出一个网络请求并下载相应的代码。通常情况下,该网络请求将是一个对 服务器的HTTP请求。
这种 Pull模式在有些情况下并不能很好的解决问题。例如,一个 Agent可能要到一个很远的地方,此时若发现缺少相关代码而发送网络请求将要付出很大的代价甚至无法完成任务。为了应付这种情况, Concordia允许用户或者开发人员在发射Agent时为它指出相关的类(related classes),这些相关的类将自动地和Agent一起迁移。除此之外,Concordia也提供了一种 Push的方式,在这种方式里,Agent使用到的一些类将和Mobile Agent一起在网络上迁移。