??xml version="1.0" encoding="utf-8" standalone="yes"?>
function getInfo()
{
var s = "";
s += " |页可见区域宽:(x)"+ document.body.clientWidth;
s += " |页可见区域高:(x)"+ document.body.clientHeight;
s += " |页可见区域宽:(x)"+ document.body.offsetWidth + " (包括边线和滚动条的宽)";
s += " |页可见区域高:(x)"+ document.body.offsetHeight + " (包括边线的宽)";
s += " |页正文全文宽:(x)"+ document.body.scrollWidth;
s += " |页正文全文高:(x)"+ document.body.scrollHeight;
s += " |页被卷ȝ?ff)Q?+ document.body.scrollTop;
s += " |页被卷ȝ?ie)Q?+ document.documentElement.scrollTop;
s += " |页被卷ȝ左:(x)"+ document.body.scrollLeft;
s += " |页正文部分上:(x)"+ window.screenTop;
s += " |页正文部分左:(x)"+ window.screenLeft;
s += " 屏幕分L率的高:(x)"+ window.screen.height;
s += " 屏幕分L率的宽:(x)"+ window.screen.width;
s += " 屏幕可用工作区高度:(x)"+ window.screen.availHeight;
s += " 屏幕可用工作区宽度:(x)"+ window.screen.availWidth;
s += " 你的屏幕讄?"+ window.screen.colorDepth +" 位彩?;
s += " 你的屏幕讄 "+ window.screen.deviceXDPI +" 像素/英寸";
//alert (s);
}
getInfo();
</script>
在我本地试当中Q?
在IE、FireFox、Opera下都可以使用
document.body.clientWidth
document.body.clientHeight
卛_获得Q很单,很方ѝ?
而在公司目当中Q?
Opera仍然使用
document.body.clientWidth
document.body.clientHeight
可是IE和FireFox则?
document.documentElement.clientWidth
document.documentElement.clientHeight
原来是W3C的标准在作怪啊
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
如果在页面中dq行标记的话
在IE中:(x)
document.body.clientWidth ==> BODY对象宽度
document.body.clientHeight ==> BODY对象高度
document.documentElement.clientWidth ==> 可见区域宽度
document.documentElement.clientHeight ==> 可见区域高度
在FireFox中:(x)
document.body.clientWidth ==> BODY对象宽度
document.body.clientHeight ==> BODY对象高度
document.documentElement.clientWidth ==> 可见区域宽度
document.documentElement.clientHeight ==> 可见区域高度
?
在Opera中:(x)
document.body.clientWidth ==> 可见区域宽度
document.body.clientHeight ==> 可见区域高度
document.documentElement.clientWidth ==> 面对象宽度Q即BODY对象宽度加上Margin宽)(j)
document.documentElement.clientHeight ==> 面对象高度Q即BODY对象高度加上Margin高)(j)
而如果没有定义W3C的标准,?
IE为:(x)
document.documentElement.clientWidth ==> 0
document.documentElement.clientHeight ==> 0
FireFox为:(x)
document.documentElement.clientWidth ==> 面对象宽度Q即BODY对象宽度加上Margin宽)(j)document.documentElement.clientHeight ==> 面对象高度Q即BODY对象高度加上Margin高)(j)
Opera为:(x)
document.documentElement.clientWidth ==> 面对象宽度Q即BODY对象宽度加上Margin宽)(j)document.documentElement.clientHeight ==> 面对象高度Q即BODY对象高度加上Margin高)(j)
真是一仉?ch)事情,其实开发来看,宁可一些对象和Ҏ(gu)Q不使用最新的标准要方便许多啊?br />
有时候需要取面的底? ׃(x)用到document.body.clientHeight , 在HTML 标准?q一句就能取到整个页面的高度, 不论body 的实际内容到底有多高, 例如, 1074*768 的分辨率, 面最大化? q个高度Uؓ(f)720 , 即ə面上只有一?#8221;hello world” , 也仍然取?20.
可是在XHTML? 如果body 体中只有一? 则document.body.clientHeight 只能取到那一行的高度, U?0px, q时如何q想取到整个面的高? p用document.documentElement.clientHeight 来获取了(jin).
原因? 在HTML ? body 是整个DOM 的根, 而在XHTML ? document 才是? body 不再是根, 所以取body 的属性时, 不能再取到整个页面的?
区别新旧标准的行?
<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.0 Transitional//EN” >
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd“>
前者指明该面使用旧标? 后者指明该面使用新标?
ȝ:
XHTML中用 document.documentElement.clientHeight 代替
document.body.clientHeight
session的安全有两层意?
1> Ҏ(gu)l客h? 不会(x)因ؓ(f)session的share和造成混ؕ, 使end-user的信息泄漏以?qing)其他安全问?/p>
2> 对系l本w来? 不会(x)因ؓ(f)有hacker通过模拟sessionid和cookie来获取server信Qq而进行恶意破?/p>
让我们逐层解释和展开问题:
1> 首先说明, 本文所有session专指Servlet HttpSession
2> 后台Session和Browser之间通过JSESSIONID来关? JSESSIONID是Servlet标准,也是关键? Servle规定Browser用Mem Cookie来存储JSESSIONID, 注意q不是disk cookie.一旦浏览器关闭后JSESSIONID׃PC消失, 更加安全.
3> Session也是一U很好的安全认证机制, 后台?x)标识session是不是已l被认证? 如果?׃?x)让用户再输入password. JSESSIONID可以被理解成Z个已l认证的key, 所以Session有安全问?
4> Servlet容器不会(x)构造相同的JSESSIONID, 客户端也很难预期JSESSIONID
5> HTTPS SSL{技术可以防止网l传输中有h恶意改JSESSIONID
6> 用Cookie的情况JSESSIONID必ȝURLRewrite. 我们可以通过对URL本n采用摘要法Q自认证来防止恶意篡改JSESSIONID.
比如: http://www.smithfox.com/abc?x=x&y=y&JSESSIONID=sdfdfsdfsdfsdfsdf&HWD=4FE23AD9892C
HWD的值是Ҏ(gu)个URL的一个摘要算? 如果有h改动?jin)URLQ这个HWD值就对不上了(jin), 前提应该是这个算法别Z知道?
7> 用户在自qPC上肯定是可以看到当前的JSESSIONID? p׃在自q日记中看C(jin)自己备忘的password一? q个不是技术安全问?
8> 一台机器有多个自然人在使用Q?出现的JSESSIONIDƺ骗Q?应该没有技术办法可以解? 只能是end-user自己心(j)Q用完就关闭Browser. 我想q应该是在情理之中的? 你是合租被盗应该是怪不得小Z安的, 也是需要自己^时提高防盗意识,呵呵.
9> 最q看到Tomcat7有个新的Ҏ(gu)说是支?防JSESSIONID劫持", q个需要更多了(jin)?
10> User和Session的关p?
Session是只认JSESSIONID不认人的, 包括自然人和pȝAccount. q个问题比较?
我们用EndUser来表C然hQ?User-Account表示pȝ帐号Q?我们分析以下几种情况
10.1> 两个EndUserq一个UserAccountq且在同一台PC, q个混ؕ不是技术问题, 大家都可以理?/p>
10.2> 两个EndUser分别使用不同的UserAccount在同一台PC, q个是合U情况, 造成混ؕ不一定是技术问?/p>
10.3> 某EndUser有两个UserAccount在同一台PC? 我们需要考虑JSESSIONID在client端可以会(x)混ؕ的问?
因ؓ(f)不同的浏览器对于Cookie share的策略不同, 我们按程序设计必L最Ҏ(gu)出问题的Case惻I比如IE8.
无论你是IE多窗口还是多TAB都是Share Cookie? 所以ȝ指导斚w是在client端做一些机制不允许用户q么?
Google 的gmail是q么做的, 你可以一台机器上用IE打开两个不同的gmail account(两个H口或是两个TAB都行)Q点新email或是其他需要和后台交互的行为时Qgmail?x)退Z个,提示让你重新l(f)oginq且 gmail account已经固定为后输入的User-Account.
具体在Client怎么防止两个Accountq需高手指点.
10.4> 某EndUserA用自qUserAccountA先已lloginQ再讉K另一个UserAccountB的资源,而且该资源是需要访问密码的.
q种情况Q往往因ؓ(f)后台Session设计的层ơ不清晰Q造成?jin)UserAccountA无需Passwordq接访问到?jin)UserAccountB的资? 而且q个解决Ҏ(gu)不能攑֜Client端, 因ؓ(f)讉KUserAccountB的资源可能就是一个在Email中的LinkQ这个click动作客户端程序JavaScript是无法拦截的.
10.5> ȝ来说:
11> 从第10>点可以看出, session和自然h或是UserAccount有着千丝万缕的联p,但不是所有的pȝ只有Userq一层业务概念,所以我们需要理解后台的Session分划和设计好Session.Attribute层次.
? 们以一个假设业务模型ؓ(f)例说明问? q是一个只面向企业的图片共享web服务, 可以为多个公?企业)提供服务, 用户必须属于某一个公? 用户可以创徏"囄分组", 囄分组可以讄为private(需要密码访?, 也可以直接公开. 囄分组是公司胦(ch)? user可以创徏"囄分组", 但是囄分组资源是归属公? 同一公司内部的所有user可以直接讉K囄分组(如果是公开), 也可以通过password(如果需?讉K囄分组.
q个业务模型? 既有比U(ku)ser更高层的概念, 比如公司. 也有比U(ku)ser更底的概? 比如用户的上传图片分l?imageGroup).
11.1> 不同的war包部|在tomcat,不同的war包之间的session是不?x)q, q个是由tomcat架构军_? 另他的没有做q调? 也有可能是Servlet标准, 有高手可以帮认一?/strong>.
11.2> 多个公司又是q行在同一个tomcat application? 怎么防止不同公司之间的session混ؕ
可以采用cM于防止重复提交的技? 首先做一个优先很高的filter, 每次reqeust和response都需要经q这个filter
? 所有login模块, 讄一个ticket cookie,写入当前company信息, 每个reqeust到达的第一步就是检client cookie和当前的URL信息, 以及(qing)session信息是否一? 如果enduser是从一个company中click?jin)一个其他company的link, 该filter׃(x)发现ticket信息不一? 然后强制logout, 再次让user login. q且每次response时做ticket的改? 使client无法模拟
11.3> 怎么防止imageGroup信息混ؕ
Session本n是一个集? 具体q是使用session.attribute["key"]
Session本n是User level? 对于低于User level的信? 需要好好规划attribute key
惛_q样的case:
有两个imageGroup, 一个是public? 一个是需要password?
http://www.smithfox.com/companyIBM/public_images/
http://www.smithfox.com/companyIBM/password_images/
后台对imageGroup输入密码逻辑的伪代码如下:
boolean needpasswd = true;
if(session.getAttribute("NEED_PASSWORD") == null){
session.setAttribute("NEED_PASSWORD", needpasswd);
boolean needpasswd = 一个很耗时很复杂的验证函数(user, imageGroup, xxx);
} else{
needpasswd = session.getAttribute("NEED_PASSWORD");
}
if (needpasswd ){
showPasswordDialog() ;
}
看出什么问题没?
应该上面的代码中的所有attribute keyҎ(gu) "NEED_PASSWORD"+{imageGroupID}
否则用户只要先看?jin)一个public? 后面的所有图片分l都无需passwd可以访问了(jin), 即ɘq个imageGroup是private?
13> 在用session之前一定需要检查是否真的一定需要session来解? 比如只是想传value到JSP pageQ?nbsp;request.setAttribte()更适合
14> 比较?yu)而多的业务对象,如果必须save在session一定要?qing)时removeAttribute否则session用的内存?sh)(x)暴?
因ؓ(f)Session不会(x)因ؓ(f)客户端不用了(jin)Q就?x)自动清理,而是必须到SessionTimeOut才会(x)Q如果在SessionTimeOut期间内有很多的对象在Session内,׃(x)有问题。所以需要即时清理已l不用的Session.Attribute
15> Cookie和Session一? 同样需要注?cookie key的层ơ问题,以及(qing)q期问题Qdomain, path问题{等
最开始,׃某些x(chng)Q于是在互联|上搭徏 ?jin)一个网站,q个时候甚x(chng)可能L都是U借的Q但׃q篇文章我们只关注架构的演变历程Q因此就假设q个时?/span> 已经是托了(jin)一C机,q且有一定的带宽?jin),q个时候由于网站具备了(jin)一定的特色Q吸引了(jin) 部分问,逐渐你发现系l的压力来高Q响应速度来慢Q而这个时候比较明昄是数据库和应用互相媄(jing)响,应用出问题(sh)(jin)Q数据库也很Ҏ(gu)出现问题Q? 数据库出问题的时候,应用也容易出问题Q于是进入了(jin)W一步演变阶D:(x)应用和数据库从物理上分,变成?jin)两台机器,q个时候技术上没有什么新的要求,但你 发现实起到效果?jin),pȝ又恢复到以前的响应速度?jin),q且支撑住了(jin)更高的流量,q且不会(x)因ؓ(f)数据库和应用形成互相的媄(jing)响?/span>
看看q一步完成后pȝ的图C:(x)
q一步涉?qing)到了(jin)这些知识体p:(x)
q一步架构演变对技术上的知识体pd本没?
要求?/span>
架构演变W二步:(x)增加面~存
好景不长Q随着讉K的h来多Q你发现? 应速度又开始变慢了(jin)Q查扑֎因,发现是访问数据库的操作太多,D数据q接竞争Ȁ烈,所以响应变慢,但数据库q?/span> 接又不能开太多Q否则数据库机器压力?x)很高,因此考虑采用~存机制来减数据库q接资源 的竞争和Ҏ(gu)据库ȝ压力Q这个时候首先也怼(x)选择采用squid {类似的机制来将pȝ中相寚w(rn)态的面Q例如一两天才会(x)有更新的面Q进行缓存(当然Q也可以采用? 面?rn)态化的方案)(j)Q这L(fng)序上可以不做修改Q就能够 很好的减对webserver的压力以?qing)减数据库q接资源的竞争,OKQ于是开始采?/span>squid来做相对?rn)态的面的缓存?/span>
看看q一步完成后pȝ的图C:(x)
q一步涉?qing)到了(jin)这些知识体p:(x)
前端面~存技术,例如squidQ如想用好的话还得深入掌握下squid的实现方式以?qing)缓存的失效? {?/span>
架构演变W三步:(x)增加面片段~存
增加?/span>squid做缓存后Q整体系l的速度实是提 升了(jin)Q?/span>webserver的压力也开始下降了(jin)Q但随着讉K量的增加Q发现系l又开始变的有些慢?jin),在?/span> C(jin)squid之类的动态缓存带来的好处后,开始想能不能让现在那些动态页面里相对?rn)态的部分也缓存v来呢Q因此? 虑采用类?/span>ESI? cȝ面片段~存{略Q?/span>OKQ于是开始采?/span>ESI来做动态页面中相对?rn)态的片段部分的缓存?/span>
看看q一步完成后pȝ的图C:(x)
q一步涉?qing)到了(jin)这些知识体p:(x)
面片段~存技术,例如ESI{,想用好的话同样需要掌?/span>ESI的实现方式等Q?/span>
架构演变W四步:(x)数据~存
在采?/span>ESI之类的技术再ơ提高(sh)(jin)pȝ的缓存效? 后,pȝ的压力确实进一步降低了(jin)Q但同样Q随着讉K量的增加Q系l还是开始变慢,l过查找Q可能会(x)发现p?/span> l中存在一些重复获取数据信息的地方Q像获取用户信息{,q个时候开始考虑是不是可以将 q些数据信息也缓存v来呢Q于是将q些数据~存到本地内存,改变完毕后,完全W合预期Q系l的响应速度又恢复了(jin)Q数据库的压力也再度降低?jin)不?/span>
看看q一步完成后pȝ的图C:(x)
q一步涉?qing)到了(jin)这些知识体p:(x)
~存技术,包括?/span>Map数据l构、缓存算法、所选用的框架本 w的实现机制{?/span>
架构演变W五步:(x) 增加webserver
好景不长Q发现随着pȝ讉K量的再度增加Q?/span>webserver机器的压力在高峰期会(x)?
升到比较高,q个时候开始考虑增加一?/span>webserverQ这也是Z(jin)同时解决可用性的问题Q避免单台的webserver
down机的话就没法使用?jin),在做了(jin)这些考虑后,军_增加一?/span>webserverQ增加一?/span>webserverӞ?x)碰C些问题,?
型的有:(x)
1、如何让讉K分配到这两台机器上,q个时候通常?x)考虑的方案是Apache自带的负载均衡方案,?/span>LVSq类的Y件负载均衡方案;
2、如何保持状态信息的同步Q例如用?/span>session{,q个时候会(x)考虑的方案有?
入数据库、写入存储?/span>cookie或同?/span>session信息{机制等Q?/span>
3、如何保持数据缓存(sh)息的同步Q例如之前缓存的用户数据{,q个时候?
怼(x)考虑的机制有~存同步或分布式~存Q?/span>
4、如何让上传文gq些cM的功能l正常,q个时候通常?x)考虑的机制是
使用׃n文gpȝ或存储等Q?/span>
在解决了(jin)q些问题后,l于是把webserver增加Z(jin)两台Q系l终于是
又恢复到?jin)以往的速度?/span>
看看q一步完成后pȝ的图C:(x)
q一步涉?qing)到了(jin)这些知识体p:(x)
负蝲均衡技术(包括但不限于g负蝲均衡? 软g负蝲均衡、负载算法?/span>linux转发协议、所选用的技术的实现l节{)(j)、主备技术(包括但不限于ARPƺ骗?/span>linux heart-beat{)(j)、状态信息或~存同步技术(包括但不限于Cookie技术?/span>UDP协议、状态信息广播、所选用的缓存同 步技术的实现l节{)(j)、共享文件技术(包括但不限于NFS{)(j)、存储技术(包括但不限于存储讑֤{)(j)?/span>
架构演变W六步:(x)分库
享受?jin)一D|间的pȝ讉K量高速增长的q福 后,发现pȝ又开始变慢了(jin)Q这ơ又是什么状况呢Q经q查找,发现数据库写入、更新的q些操作的部分数据库q接?/span> 资源竞争非常Ȁ烈,D?jin)系l变慢,q下怎么办呢Q此时可选的Ҏ(gu)有数据库集群和分库策 略,集群斚w像有些数据库支持的ƈ不是很好Q因此分库会(x)成ؓ(f)比较普遍的策略,分库也就意味着要对原有E序q行修改Q一通修改实现分库后Q不错,目标辑ֈ ?jin),pȝ恢复甚至速度比以前还快了(jin)?/span>
看看q一步完成后pȝ的图C:(x)
q一步涉?qing)到了(jin)这些知识体p:(x)
q一步更多的是需要从业务上做合理的划分, 以实现分库,具体技术细节上没有其他的要求;
架构演变W七步:(x)分表?/span>DAL和分布式~存
随着pȝ的不断运行,数据量开始大q度增长Q这个时候发现分库后查询仍然
?x)有些慢Q于是按照分库的思想开始做分表的工作,当然Q这不可避免的会(x)需要对E序
q行一些修改,也许在这个时候就?x)发现应用自p兛_(j)分库分表的规则等Q还是有些复?
的,于是萌生能否增加一个通用的框架来实现分库分表的数据访问,q个?/span>ebay的架构中对应的就?/span>DALQ这个演变的q程相对而言需要花费较长的旉Q当?dng)也有可能q个通用的框架会(x){到分表做完后才开
始做Q同Ӟ在这个阶D可
能会(x)发现之前的缓存同步方案出现问题,因ؓ(f)数据量太大,D现在不太可能缓存存在本
圎ͼ然后同步的方式,需要采用分布式~存Ҏ(gu)?jin),于是Q又是一通考察和折,l于是将大量的数据缓存{Ud分布式缓存(sh)?jin)?/span>
看看q一步完成后pȝ的图C:(x)
q一步涉?qing)到了(jin)这些知识体p:(x)
分表更多的同h业务上的划分Q技术上涉及(qing) 到的?x)有动?/span>hash法?/span>consistent hash法{;
DAL涉及(qing)到比较多的复杂技术,例如数据库连接的理Q超时、异常)(j)、数据库操作的控Ӟ时、异常)(j)、分 库分表规则的装{;
架构演变W八步:(x)增加更多?/span>webserver
在做完分库分表这些工作后Q数据库上的压力
已经降到比较低了(jin)Q又开始过着每天看着讉K量暴增的q福生活?jin),H然有一天,发现pȝ的访问又开始有变慢的趋?/span>
?jin),q个时候首先查看数据库Q压力一切正常,之后查看webserverQ发?/span>apached?jin)很多的hQ而应用服?
器对每个h也是比较快的Q看?/span> 是请求数太高D需要排队等待,响应?
度变慢,q还好办Q一般来_(d)q个时候也?x)有些钱了(jin),于是d一?/span>webserver服务器,在这个添?/span> webserver服务器的q程Q有可能?x)出现几U挑(xi)战:(x)
1?/span>Apache的Y负蝲?/span>LVS软负载等无法承担巨大?/span>web讉K量(hq接数、网l流量等Q的调度?jin),q个时候如果经费允许的话,?x)采取的?gu)是购
买硬件负载,例如F5?/span>Netsclar?/span>Athelon之类的,如经费不允许的话Q会(x)采取的方案是应用从逻辑上做一定的分类Q然后分散到不同的Y负蝲?
中Q?/span>
2、原有的一些状态信息同步、文件共享等Ҏ(gu)可能?x)出现瓶颈,需要进行改
q,也许q个时候会(x)Ҏ(gu)情况~写W合|站业务需求的分布式文件系l等Q?/span>
在做完这些工作后Q开始进入一个看似完的无限伸羃的时代,当网站流量增
加时Q应对的解决Ҏ(gu)是不断的添?/span>webserver?/span>
看看q一步完成后pȝ的图C:(x)
q一步涉?qing)到了(jin)这些知识体p:(x)
C(jin)q一步,随着机器数的不断增长、数据量 的不断增长和对系l可用性的要求来高Q这个时候要求对所采用的技术都要有更ؓ(f)深入的理解,q要根据网站的需求来做更加定制性质的品?/span>
架构演变W九(ji)步:(x)数据d分离和廉价存储方?/span>
H然有一天,发现q个完美的时代也要结? ?jin),数据库的噩梦又一ơ出现在眼前?jin),׃d?/span>webserver太多?jin),D数据库连接的资源q是不够用,而这个时候又已经分库分表?jin),开始分析数据库的压力状况, 可能?x)发现数据库的读写比很高Q这个时候通常?x)想到数据读写分ȝ?gu)Q当?dng)q个Ҏ(gu)要实现ƈ?/span> Ҏ(gu)Q另外,可能?x)发C些数据存储在数据库上有些费Q或者说q于占用数据库资源,? 此在q个阶段可能?x)Ş成的架构演变是实现数据读写分,同时~写一些更为廉L(fng)存储Ҏ(gu)Q例?/span>BigTableq种?/span>
看看q一步完成后pȝ的图C:(x)
q一步涉?qing)到了(jin)这些知识体p:(x)
数据d分离要求Ҏ(gu)据库的复制?/span>standby{策略有深入的掌握和理解Q? 同时?x)要求具备自行实现的技术;
廉h(hun)存储Ҏ(gu)要求?/span>OS的文件存储有深入的掌握和理解Q同时要 求对采用的语a在文件这块的实现有深入的掌握?/span>
架构演变W十步:(x)q入大型分布式应用时代和廉h(hun)服务器群梦想时代
l过上面q个漫长而痛苦的q程Q终于是再度
q来?jin)完的时代Q不断的增加webserver可以支撑越来越高的讉K量了(jin)Q对于大型网站而言Qh气的重要?/span>
庸置疑,随着人气的越来越高,各种各样的功能需求也开始爆发性的增长Q这个时候突然发
玎ͼ原来部v?/span>webserver上的那个web应用已经非常庞大 ?jin)?
当多个团队都开始对其进行改动时Q可真是相当的不方便Q复用性也相当p糕Q基本是每个团队都做?jin)或多或重复的事情Q而且部v和维护也是相当的ȝ(ch)Q?/span>
因ؓ(f)庞大的应用包?/span>N台机器上复制、启动都需要耗费不少的时_(d)出问题的时候也不是很好查,另外一个更p糕的状冉|很有
可能?x)出现某个应用上?/span>bug导 致了(jin)全站都不可用Q还有其他的像调优(sh)好操作(因ؓ(f)?
器上部v的应用什么都要做Q根本就无法q行针对性的调优Q等因素Q根据这L(fng)分析Q开始痛下决?j),?/span>
pȝҎ(gu)职责q行拆分Q于是一个大型的分布式应用就诞生?jin),通常Q这个步骤需要耗费相当
长的旉Q因Z(x)到很多的挑(xi)战:(x)
1、拆成分布式后需要提供一个高性能、稳定的通信框架Qƈ且需要支持多U?
不同的通信和远E调用方式;
2、将一个庞大的应用拆分需要耗费很长的时_(d)需要进行业务的整理和系l?
依赖关系的控制等Q?/span>
3、如何运l_(d)依赖理、运行状늮理、错误追t、调优、监控和报警{)(j)
好这个庞大的分布式应用?/span>
l过q一步,差不多系l的架构q入相对E_的阶D,同时也能开始采用大?
的廉h器来支撑着巨大的访问量和数据量Q结合这套架构以?qing)这么多ơ演变过E吸取的l验来采用其他各U各L(fng)Ҏ(gu)来支撑着来高的访问量?/span>
看看q一步完成后pȝ的图C:(x)
q一步涉?qing)到了(jin)这些知识体p:(x)
q一步涉?qing)的知识体系非常的多Q要求对? 信、远E调用、消息机制等有深入的理解和掌握,要求的都是从理论、硬件、操作系l以及(qing)所采用的语a的实现都有清楚的理解?/span>
q维q块涉及(qing)的知识体pM非常的多Q多数情 况下需要掌握分布式q行计算、报表、监控技术以?qing)规则策略等{?/span>
说v来确实不怎么费力Q整个网站架构的l典演变q程都和上面比较的类|当然Q每步采取的Ҏ(gu)Q演? 的步骤有可能有不同,另外Q由于网站的业务不同Q会(x)有不同的专业技术的需求,q篇blog更多的是从架构的角度来讲解演变的q程Q当?dng)其中q有很多的技术也未在此提?qing),像数据库集群、数 据挖掘、搜索等Q但在真实的演变q程中还?sh)(x)借助像提升硬仉|、网l环境、改造操作系l?/span>CDN镜像{来支撑更大的流量,因此在真实的发展q程中还?sh)(x)有很多的不同,另外一个大型网站要做到的远q? 不仅仅上面这些,q有像安全、运l、运营、服务、存储等Q要做好一个大型的|站真的很不Ҏ(gu)Q写q篇文章更多的是希望能够引出更多大型|站架构演变的介 l,:)?/span>