星期四, 十月 07, 2004

Perl 和网格基础设施

Martin C. Brown (questions@mcslp.com)
自由作家,Studio B
2004 年 4 月

不管您是要开发一个独立的网格,或是只想为现有的网格提供一个接口,Perl 都可以提供帮助。通过其可扩展的体系结构和对构成现代网格的众多协议和系统的支持,无论是在提交阶段还是在计算阶段,Perl 都是理想的候选者。

Perl 仍然是现有最流行和使用最多的通用脚本语言。它对于 Web 的关照仍然是其最大卖点之一,您可以利用这一点以及其他一些功能增强 ?? 如跨平台支持、众多数据库服务和连接选项 ?? 帮助构建网格服务。

在本文中,我分析 Perl 作为 Web 服务平台的机制,如果想将 Perl 集成到基于 OGSI 的网格应用程序和服务中,这是重要的一步,其中包括了对一些支持通信工具、数据库工具程序和 Web 界面组件的分析。

Perl,灵活的朋友
当您想要构建或者开发网格时,首先会选择哪种语言呢?

各 种选择太多了,从像 Pascal、C 和 C++ 这样的编译语言到 “实时(just-in-time)”的、基于字节的开发语言如 Java 语言。不过在网格中,通常最大的要求是语言要有灵活性,同时又有足够的实用性,使它可以用于不同的目的,而不会受到大的限制。

这种语言还应该具有可用性 ?? 就是说,容易使用和用它开发应用程序,这样就可以迅速和容易地延伸和扩展网格。可用性还使开发基于网格基础设施的新应用程序更容易,这在使用计算网格时特别重要,在那里您可能需要开发自定义的计算组件以处理进程。

最后,也是最重要的,如果希望支持异质的网格,那么这种语言就需要支持尽可能多的操作系统并提供平台独立的代码,这样才可以容易地部署网格应用程序。

所 有这些灵活性都指向一种脚本语言,不错,就是 Perl。从老的 Digital VAX 系统到 DOS、Windows、Unix、Mac OS 和许多其他操作系统都支持 Perl。除了容易使用外,特别是在开发应用程序时,Perl 的一个最强大的功能是它可以与另一种语言通信(主要是 C)。这使它除了在系统中构建的所有功能和通过 Perl 自己基于模块的扩展系统所支持的功能外,还可以使用范围广泛的外部工具和库。Comprehensive Perl Archive Network(CPAN,一个现成的模块和 Perl 语言扩展集合)使 Perl 特别有用和容易使用。它们是用户贡献的语言扩展,或者是完全用 Perl 编写的,或者是用 C 接口 连接到外部库。

CPAN 文档包括从 Postscript 驱动和 Web 界面构造器到数据库接口和 XML 解析器和处理器的所有内容。可以使用其中许多模块帮助构建网格应用程序,或者使用合适的扩展连接现有的网格环境,如 Globus。

通信工具
网格组件需要彼此通信以进行操作,这样拥有在不同的组件之间进行通信的方法就很关键了。有几种方法可以在计算机之间进行网格目的的通信。

直接的 TCP/IP 通信是可以使用的最基本的系统,在某些方面,它既是最灵活的,也是最难于有效使用的。IO::Socket 工具包提供了到基本 TCP/IP 套接字的最好接口。要处理多连接,您可以使用 fork()select() 或者 threads(在支持它的系统上),或者更简单的循环(round-robin)解决方案。

对 于具有容易使用和灵活的客户机/服务器结构的跨平台兼容解决方案,选择 POE(Perl 对象环境,Perl Object Environment)就对了。POE 是多任务网络框架,它支持基于服务器或者客户机的多连接,然后利用事件驱动的接口处理双向的信息传输。例如,下面是一个简单的服务器,它使用函数处理事 件:




use POE;



sub handler_start

{

...

}



sub handler_increment

{

...

}



sub handler_stop

{

...

}



for (0..9) {

POE::Session->create(

inline_states =>

{ _start => \&handler_start,

_stop => \&handler_stop,

}

);

}



$poe_kernel->run();

exit;

不过,如果准备使用事件驱动的环境,那么 Web 服务是更有效的解决方案,在范围更广泛的网格应用程序中,它们还有其他的好处。

Web 服务
Web 服务证明是许多网格解决方案的基础和未来。例如,Globus 和 OGSA/OGSI 标准就是基于 Web 服务平台的。其原因不难看出。Web 服务提供了主机之间透明和灵活的通信,对远程主机上的过程或者函数的调用就像调用的是本地过程或者函数。

Perl 提供了各种基于两个主要标准(SOAP 和 XML-RPC)的 Web 服务实现。OGSI 标准使用 SOAP 标准,它优于 XML-RPC 的一点是它让您除了可以使用远程过程调用之外,还可以使用远程对象。

在 Perl 中最好的 SOAP 支持模块是 SOAP::Lite。可以在 Perl 中用下面的代码创建一个基本的 SOAP 服务器:




use SOAP::Transport::HTTP;

SOAP::Transport::HTTP::CGI

->dispatch_to('/export/http/webs/grid/','DWGrid::Demo')

->handle();

您需要将它拷贝到一个脚本中 ?? 如 request.cgi ?? 并宿主到一个现有的 Web 服务器如 Apache 或者 IIS 中。这个脚本使用 CGI(通过 SOAP::Transport::HTTP::CGI 包)创建一个 Web 服务,作为请求进行传输。所有到远程脚本的 SOAP 请求都发送对这个类的一个 SOAP 函数和/或包 DWGrid::Demo 的请求。这个模块应当包含所要支持的函数的定义,包括类和对象方法,如构造函数和属性处理器。

对于独立的 SOAP 服务器,使用 SOAP::Transport::HTTP::Daemon 模块作为基础。如果需要加快 Web 服务的响应,可以用另一个传输模块 SOAP::Transport::HTTP::Apache 通过 mod_perl 实现。

在客户端,可以直接或者自动调用远程函数。直接方法像下面这样:




use SOAP::Lite;

print SOAP::Lite

->uri('http://test.mcslp.pri/SOAP/Demo')

->proxy('http://test.mcslp.pri/SOAP/request.cgi')

->getmessage()

->result;

上面的代码通过服务器上的 SOAP 调用远程函数 getmessage()。还可以使用 autodispatch 方法,它使您可以透明地使用远程函数,而不用通过服务器显式命名它们。例如,可以用下面的脚本调用同一个函数:




use SOAP::Lite +autodispatch =>

uri => 'http://test.mcslp.pri/SOAP/Demo',

proxy => 'http://test.mcslp.pri/SOAP/request.cgi';



print getmessage();

SOAP 真正强大之处在于创建远程对象并与之交互的能力。在网格中,可以将它与定义网格应用程序的类结合使用。发布网格应用程序时,可以将这个模块拷贝到不同的提 供者上。当作业到达分发者(distributor)时,可以创建一个新的网格对象,提供必要的参数并得到结果。因为对象是持久性的,所以您可以使用有状 态或者基于会话的网格应用程序。

例如,可以在需要状态信息的解决方案 ?? 如数据库处理 ?? 或者提供持久性存储或者到信息和其他系统的接口的解决方案中使用 SOAP。它们还可用于计算系统需要复合计算,同时不需要发送更多信息的地方。例如,视频编码通常使用来自上一帧的信息。交换像这样的大量信息会对网格的 网络造成严重影响,特别是当它跨越了局域网的边界时。

在像资源或者应用程序网格这样需要从网格提供者得到立即答复和响应的直接访问网格中,可以让网格对象在分发者上保持活动以便在需要时重复使用。

下面的脚本是一个典型分发者的例子(有删节),在基于对象的、分发者引导的网格应用程序中使用了 SOAP :




use DWGrid;



use SOAP::Lite +autodispatch =>

uri => 'http://test.mchome.com/SOAP/DWGrid',

proxy => 'http://test.mchome.com/SOAP/provider.cgi';



my $providers = get_providers();



for my $providerid (keys %{$providers})

{

$providers->{$providerid}->{'remote'} = DWGrid->new('DWGrid::Resource');

}



while(1)

{

my $requests = list_queue('requests');

for my $reqid (keys %{$requests})

{

for $providerid (keys %{$providers})

{

...

$providers->{$providerid}->{'remote'}

->store_document($requests->{$reqid});

...

}

}

...

}

可以看到,这里我是如何创建一个简单的、基于散列的结构来保持对提供者上的远程 SOAP 对象的引用。然后我可以直接调用提供者上的这个函数,无需再次打开连接。

OGSI::Lite
作 为 Perl 灵活性以及它适于集成到网格中的一个例子,只需要看看 OGSI::Lite 包就够了。OGSI::Lite 是一个网格服务的容器,使服务可以用 Perl 编写。使用 OGSI::Lite 时,通过创建一个继承标准 OGSI 类的类可以将 Perl 类导出为网格服务。与服务的通信是由您在前面的例子中看到的 SOAP::Lite 包处理的。

关于 OGSI::Lite 和已经用于 lattice Boltzmann 计算的网格服务(它们都是用 Perl 编写的)的更多信息请参阅 参考资料

Perl 和 Globus
Globus 是各种网格解决方案中最流行一种,它有一个 Perl Commodity Grid(CoG) 工具包使您可以用 Perl 作为网格中的服务或者管理组件。这适用于大多数 Globus 2.x 版本。对于 Globus 3.0 及以后的版本,应当使用 OGSI::Lite 包,因为 Globus 3.0 是 OGSI 兼容的。

数据管理
在 所有网格应用程序的背后,是一个提供信息中其他内容的可靠数据库系统。对于计算网格,数据库存储了未处理的工作单元和返回的结果。Perl 在这里(通过标准模块选择和 CPAN)提供了不同的解决方案,包括在磁盘解决方案中使用了基本的基于文件的系统或者 DBM 风格的散列。

数 据库接口(Database Interface,DBI)工具包通过用数据库驱动(DBD)连接到各个数据库提供了架构中立的解决方案。到底层数据库的接口可能是不同的,但是 DBI 模块提供了不变的接口(幸运的是大多数使用 SQL)。这意味着您可以在需要时和环境改变时改变数据库,同时不用对代码做大幅度修改。

独立的驱动程序系统使您可以用使用像 MySQL 和 PostGreSQL 这样的开放源代码解决方案,也可以使用像 Oracle 和 DB2 这样的商业软件,都通过相同的接口。

这 些接口可以在本地工作,也可以通过网络工作,这样就可以用这个系统使提供者访问远程数据库解决方案以下载工作和数据。因为有了对多种数据库的支持,所以可 以让网格应用程序分布在有一个数据库或者多个数据库源的网格上,也可以分布在网格的网格(支持几个独立的网格作为一个网格服务器集合的一部分)上, 其中不同的网格组使用不同的数据源。

如果希望一个本地化的解决方案,比如在一个不想安装全功能的数据库解决方案中,或者提供 对这样的数据库的远程访问的网格提供者上安装一个 '轻量级' 数据库实现,那么可以使用 DBD::CSV 驱动。这个模块使用简单的逗号分隔(CSV)文件,同时支持用 SQL 语言访问。可以创建数据库,更新记录并管理数据,就像使用一个典型的 RDBMS 一样,但是使用的是基本文本文件并且不需要外部应用程序。

Web 界面
网格开发语言的最后一项考虑是它在系统中的整体效果和使用性。所有网格都需要管理。需要一种向网格提交工作和信息的方法和在网格运行时管理及监视网格项目和信息的方法。

有大量完成这些任务的方法,但是一个突出的方法是使用 Web 站点作为监视和管理解决方案。同样,Perl 得分最高。它有支持动态 Web 网站和界面的长期历史,在 Web 上有很多动态内容是通过 Perl 支持的。

用同样的工具提供 Web 界面和管理网格使得将这两个系统集成到一起变得容易了。即使不是整个系统都使用 Perl,而是使用像 SOAP、XML-RPC 或者 C 扩展接口这样的工具,也可以用 Perl 作为到网格服务的接口。

结束语
在 本文中我们分析了典型网格的一些最常见的部分,以及 Perl 如何通过结合内置模块、系统和来自 CPAN 和其他地方的外部模块提供对这些元素的支持。这些主要内容包括数据库的使用、网格管理的 Web 界面和通信。最新的网格现在依靠 Web 服务体系结构,因此有必要了解用 Perl 编写的 SOAP 实现,以及其他机构是如何在现有网格环境如 Globus 和 OGSI 兼容的网格框架中使用 SOAP 系统的。

参考资料

关于作者
Martin C. Brown, Studio B 的作者,以前是一位具有跨平台集成经验的 IT 主管。他是一个目光敏锐的开发人员,曾经为一些重要客户构建动态站点,他是 Foodware.net 的技术主管。现在,MC 是一位自由作家和顾问,由于他的名气,他作为一个 SME 与 Microsoft 紧密合作;同时也是 LinuxWorld 杂志的 LAMP Technologies Editor;还是 AnswerSquad.com 团队的核心成员;他曾经编写的书籍包括 XML Processing with Perl、Python and PHP、Microsoft IIS 6 Delta Guide 等。可以通过 questions@mcslp.com 与 MC 联系。

0 Comments:

发表评论

<< Home