欢迎您访问科普小知识本站旨在为大家提供日常生活中常见的科普小知识,以及科普文章!
您现在的位置是:首页  > 科普文章

浅谈用HTML+Ajax实现服务器负载均衡

科普小知识2022-09-05 14:48:39
...

在计算机技术飞速发展的今天,一个大企业拥有两台或多台同等配置的服务器的情况已经司空见惯。

在负载均衡的思路下,多台服务器为对称方式,每台服务器都具有同等的地位,可以单独对外提供服务而无须其他服务器的辅助。通过负载分担技术,将外部发送来的请求按一定规则分配到对称结构中的某一台服务器上,而接收到请求的服务器都独立回应客户机的请求。

提供服务的一组服务器组成了一个应用服务器集群(cluster),并对外提供一个统一的地址。当一个服务请求被发至该集群时,根据一定规则选择一台服务器,并将服务转定向给该服务器承担,即将负载进行均衡分摊。

通过应用负载均衡技术,使应用服务超过了一台服务器只能为有限用户提供服务的限制,可以利用多台服务器同时为大量用户提供服务。当某台服务器出现故障时,负载均衡服务器会自动进行检测并停止将服务请求分发至该服务器,而由其他工作正常的服务器继续提供服务,从而保证了服务的可靠性。

上述的集群技术一般都用于web服务器、应用服务器等,而不是用于数据库服务器,即不是用于有共享的存储的服务。数据库服务器将涉及到加锁、回滚等一系列问题,要复杂的多。一般数据库服务器只是使用双机,其中一台工作,另一台备份。数据库的双机并行只用于大型数据库中。

常见的负载均衡实现的方法有以下几种:最简单的是通过dns,但只能实现简单的轮流分配,也不能处理故障。wWw.11665.CoM如果是基于ms iis,windows 2003 server本身就带了负载均衡服务。但这一服务也只是轮流分配。 硬件方式,通过交换机的功能或专门的负载均衡设备可以实现。对于流量的分配可以有多种方式,但基本上都是应用无关的,与服务器的实际负载关系也不大。另外,设备的价格较贵(优点是能支持很多台服务器)。这种方式往往适合大流量、简单应用。 软件方式,通过一台负载均衡服务器进行,上面安装软件。这种方式比较灵活,成本相对也较低。另外一个很大的优点就是可以根据应用的情况和服务器的情况采取一些策略。这方面比较典型的软件产品,是富士通西门子公司的pcl sis负载均衡软件。

我们所要讨论的所谓负载均衡是除这几种以外的另一种方法,即用大家都比较熟悉的html技术和眼下炙手可热的ajax技术。

html,全称hypertext mark-up language——超文本标记语言。

普通的媒体记载信息的形式都是定义一个开头,然后以线性方式或时间的顺序进行到结尾。这种媒体包括电影、录音和录像带等,大多数的书本上的信息也是以这种形式组织的。

而在 /music/">音乐激光唱盘,如果你想听第五首曲子就可以选择它并立即播放。这不同于录音带的使用,因为你必须先播放几次录音带你才能知道一首歌从哪里开始。

超媒体的概念应用于文本后,我们就有了超文本,现在你只要点击一个链接你就会看到新的内容或新的页面。如果你能获取世界上不同计算机上的文档的链接,那么你就可以体会到一个像蜘蛛网一样分布的信息世界,这里充满了交错的链接和网页,这就是我们知道的 /english/">英文的原义是遍布世界的蜘蛛网。在万维网上,网页是存放在众多的 web服务器里的,这些服务器与国际互联网相连,我们通过浏览器就可以上网浏览这些网页。

万维网发展非常迅猛的原因之一就是所有的网页都是以同一格式编写的,这种格式或编写的语言就是html(hypertext markup language),即超文本标记语言。

ajax,全称asynchronous javascriptand xml——异步javascript和xml。

ajax不是一项技术。事实上它是几种各自发展的技术的有力集合。ajax包括:使用xhtml与css的标准表现(standards-based presentation); 使用dom(document object model)进行动态显示与交互; 使用xml and xslt 进行数据交换与操作; 使用xmlhttprequest进行异步数据传输; 使用javascript将所有这些绑在一起。

传统的web应用模型是这样工作的:界面中大部分的用户行为触发一次返回web服务器的http请求,服务器完成一些处理——接收数据,处理计算,再访问其它的数据库系统,最后返回一个html页面到客户端。这是一个老套的模式,自采用超文本作为web使用以来,一直都这样用,但看过《the elements of user experience》的读者一定知道,是什么限制了web界面没有桌面软件那么好用。

技术上,这种方法很有意义。但它并不有助于友好的用户体验。当服务器在做它的事情的时候,用户在做什么?不错,等待。而且是每进行一步操作,就要等待一次。

很明显,假如我们设计含有web表单的应用,我们不会让用户在那里空等(译注:用户提交表单之后,通常会返回一个含有相关信息的页面到客户端)。当加载一个界面时,为什么用户交互每次都要停下来,以等待服务器响应应用请求?为什么用户要经历应用与服务器之间的交互?

ajax有什么不同?

ajax应用通过在客户端与服务端之间引入一个中间层——ajax引擎(ajaxengine),改变了web交互“start-stop-start-stop”的规律。增加一个层看起来似乎降低了应用的响应性,但事实恰好相反。

浏览器通过加载一个ajax引擎,来取代加载一个web页。ajax引擎用javascript编写,通常放在一个隐藏的框架中。引擎负责渲染用户界面,帮助用户与服务端通信。ajax引擎允许用户与应用的交互异步发生,独立于与服务端的通信。所以,用户不用再盯着空白的浏览器窗口和沙漏光标,等待服务端的响应。

对于每个用户行为(user action),原本的做法是生成一次http请求;现在变成了对ajax引擎的一次javascript call,响应那些不用返回服务端的用户行为——比如简单的数据验证,在内存中编辑数据甚至是一些导航——都由引擎自己处理。如果引擎需要服务端的响应——比如提交数据以供处理、加载额外的界面代码,或者获得新数据——引擎便会使用xml进行异步请求,而不用停止用户与应用的交互。

其实,凡是用到ajax的地方必定用到html语言,因为没有了html语言ajax也就失去了它存在的意义。先来看下我们的代码吧:

ajax.html

<html>

<head>

<meta http-equiv="content-type" content="text/html; charset=gb2312">

<title>index_redirect</title>

<script language="javascript">

function redirectpage(){

var now = new date();

var time = now.gettime();

var flag = times%2; var url;//首选url

var urlbak;//备用url

var errorinfo=1;//定义服务器状态信息,1为正常,0为异常

if(flag==0){

url='192.168.0.1:8080/index.jsp';

urlbak='192.168.1.1:8080/index.jsp';

}else{

url='192.168.1.1:8080/index.jsp';

urlbak='192.168.0.1:8080/index.jsp';

}

try{

varxmlhttp=new activexobject("microsoft.xmlhttp");

xmlhttp.open("get",url,false);

xmlhttp.send(null);

}catch(e){

errorinfo=0;//主用server异常,将服务器状态信息置位0

}

if(errorinfo==1){//主用server正常

window.top.location=url;

} else{

window.top.location=urlbak;

}

</script>

</head>

<body onload = redirectpage();>

</body>

</html>

此页面在用户登录服务器之前,先进行服务器的状态判断。拿当前时间的毫秒数(time = now.gettime();)的奇偶进行控制,如果当前毫秒数为奇数,即times%2=1,页面自动转往'192.168.1.1:8080/index.jsp',如果当前毫秒数为偶数,即times%2=0,页面自动转往'192.168.0.1:8080/index.jsp',从而达到负载均衡的效果。

当然,这只是比较乐观的情况。假如当前毫秒数为奇数,而'192.168.1.1:8080/index.jsp'这个服务不可用的话,这时我们就可以利用ajax技术进行判断,

xmlhttp.open("get",url,false);

xmlhttp.send(null);

如果响应异常的话,将会抛出异常:

catch(e){

errorinfo=0;//主用server异常,将服务器状态信息置位0

}

此时errorinfo被置为0,从而将用户请求转向'192.168.0.1:8080/index.jsp';反之,如果当前毫秒数为偶数,而'192.168.0.1:8080/index.jsp'异常的话,errorinfo的值仍然为1,从而将用户的请求转向'192.168.1.1:8080/index.jsp'。进而起到保障只要有一台服务器正常,用户的请求就可以正常响应的目的。

参考文献:

[1][美]穆西亚诺,[美]肯尼迪著,张洪涛,邢璐译.html&xhtml权威指南(第六版).清华大学出版社,2007.

[2]扎卡斯,姆克皮克,福西特著,徐锋等译.ajax高级程序设计.人民邮电出版社,2006.