首页 | 社区 | 博客 | 招聘 | 文章 | 新闻 | 下载 | 读书 | 代码
亲,您未登录哦! 登录 | 注册

开发安全稳固的分布式多层应用系统

打印文章

分享到:
中国航天科技集团第十一研究所计算中心 陈彦林 王晓宁

引言
在分布式计算环境中,程序员开发的应用系统除了必须能够正确而且有效率地运行之外,如何让应用系统更为安全强固,不会因为应用程序服务器或是数据库服务器故障而导致整个应用系统无法继续运行也是非常重要的。例如,假设你开发了一个多层分布式应用系统,其中包含了数十甚至数百台客户端机器,数台应用程序服务器,以及一台数据库服务器。有一天所有的用户正在输入数据,而且每一个用户已经在客户端机器中输入了数十笔数据,但是就在用户把这些数据更新回数据库时,突然有一台应用程序服务器发生了故障,那么所有连结到这台应用程序服务器的客户端用户如何更新他们输入的数据到数据库服务器之中呢?如果更不幸的是此时是数据库服务器发生了故障,或是所有的应用程序服务器都发生了故障,那么所有用户输入的数据又该怎么办呢?以前我曾碰到过这种情况,通常的解决办法是用户必须关闭应用程序,等系统恢复后,重新输入所有的数据。这种情况是大家都不愿看到的,那么有没有什么好的办法解决这个问题呢?
实现安全强固的分布式多层应用系统的条件
从以上问题可以看出,一个分布式多层应用系统必须满足以下条件才能成为安全强固的分布式多层应用系统:
1、 当某台应用程序服务器发生故障时,原先连结到该应用程序服务器的客户端可以立刻连结到其它提供相同服务的应用程序服务器,并继续取得服务。这就是所谓的容错能力。
2、 当所有的应用程序服务器都发生了故障,或是数据库服务器发生了故障,客户端应用程序应该有一种机制能够把用户更新的数据暂存在客户端机器中,等应用程序服务器或是数据库服务器恢复正常后,客户端应用程序可以把暂存的数据加载到系统中,再实际更新回数据库服务器中。
3、 能够根据应用程序服务器的不同负荷,动态分配客户端的连接,不至于有的应用程序服务器负载过重,而有的应用程序服务器负载过轻,使得所有的应用程序服务器的负载达到一个平衡。这就是所谓的负载平衡能力。
在Delphi 中的实现
在Delphi中,开发安全强固的应用程序服务器与开发一般的应用程序服务器没有什么不同,主要的不同在客户端。因为这些能力是在客户端实现的。Delphi 提供了一个TSimpleObjectBroker组件,该组件提供了基本的容错能力和负载平衡能力,此外你也可以继承这个组件实现更复杂的容错能力和负载平衡能力。
1、 容错能力的实现
TSimpleObjectBroker组件会维护一个能够执行应用程序服务器的机器列表,并且提供其中的机器名称给TDCOMConnection 或是 TSocketConnection 作为连结的远程机器的名称。当TDCOMConnection 或是 TSocketConnection 连结的机器故障时,TDCOMConnection 或是 TSocketConnection 可以从TSimpleObjectBroker取得一个新的能够执行应用程序服务器的远程机器名称,然后再连结到这台新机器以取得应用程序服务器的服务。
2、 暂存数据的实现
TClientDataSet提供了两个方法SaveToFile和LoadFromFile。当所有的应用程序服务器都发生了故障,或是数据库服务器发生了故障时,调用SaveToFile方法把ClientDataSet中所有的数据包括在客户端更新的数据保存到一个文件中,然后在应用程序服务器或是数据库服务器恢复正常后再执行客户端应用程序,调用LoadFromFile方法加载先前存储的数据到ClientDataSet中,最后再调用ApplyUpdates方法把客户端更新的数据更新回数据库中。
3、 负载平衡能力的实现
要让分布式多层应用系统提供负载平衡能力,只需要设定TSimpleObjectBroker 的LoadBalanced 属性值为True就可以提供简单的负载平衡能力。
关键程序代码
实现安全强固的分布式多层应用系统的关键程序代码如下,当客户端应用程序执行数据更新服务时,如果其所连结的应用程序服务器发生了故障,那么客户端应用程序就会产生一个例外。这个时候客户端就调用TSimpleObjectBroker的SetConnectStatus方法设定目前的应用程序服务器为不可用状态,然后再调用TSimpleObjectBroker的GetComputerForProgID 方法从TSimpleObjectBroker取得下一个可用的应用程序服务器,最后连结到这个新取得的应用程序服务器并继续执行数据更新服务。如果所有的应用程序服务器都发生了故障,或是数据库服务器发生了故障,就调用TClientDataSet的SaveToFile方法把ClientDataSet中所有的数据包括在客户端更新的数据保存到一个文件中,以便系统恢复后再导入系统中。

procedure TForm1.btnApplyUpdatesClick(Sender: TObject);
begin
try
ClientDataSet1.ApplyUpdates(0);
except
on Exception do
begin
try
DCOMConnection1.Connected := False;
SimpleObjectBroker1.SetConnectStatus
(DCOMConnection1.ComputerName, False);
finally
try
DCOMConnection1.ComputerName := SimpleObjectBroker1.GetComputerForProgID
(DCOMConnection1.ServerName); // 取得可用应用程序服务器的机器名称
DCOMConnection1.Connected := True;
ClientDataSet1.ApplyUpdates(0);
except
on EBrokerException do
ClientDataSet1.SaveToFile('Sample.Dat'); // 保存数据
end;
end;
end;
end;
end;


摘自:计算机世界网

本栏文章均来自于互联网,版权归原作者和各发布网站所有,本站收集这些文章仅供学习参考之用。任何人都不能将这些文章用于商业或者其他目的。( Pfan.cn )

编程爱好者论坛

本栏最新文章