大型Web架构思想系列专题之-精工细作

好几天都没写东西了,不知道是不是最近天气湿冷的原因。凑巧今天天气不错,在阳光的沐浴下开始了今天的专题分享。

上几次我们都一直在讨论大型站点的内核,就像我们在讨论一辆汽车的发动机一样,实际上我们更像是在讨论一艘航母的动力系统。现在常听都是靠核裂变运转的核动力航母,但是也有人在设想出现核聚变反应堆的航母。就像我们以前经常碰到数据库驱动瓶颈,然后出现很多分布式部署架构-XX数据库群、XX服务器群、XX存储器群等等。今后可能还会碰到更多的问题,就像“海上浮动机场”的宿命一样-未来可能将向隐形化发展。不管怎样,即便再好的动力设施,也需要很多部件的配合及合理的设计。如果核动力仅仅是用来排水的,我想这样的航母不会有人称赞的。网站也是如此。让我想起曾经招聘的时候,时常会聊到之前的一些案例。就会跟他们探讨网站有什么独特之处,听到的结果出奇的一致,譬如:我这个站用了Oracle,用了企业级硬件防火墙,还用了IBM服务器云云。所以应用xx学也就衍生出来许多。说到应用真的要感谢很多在业内默默奉献的战士们,他们提供很多开源的应用技术解决方案。很难想象没有他们的支撑会是怎样,也许就不会有这么多的问题了吧,呵呵...

用户体验

经常会听到有人在讨论页面的美观问题,但是很少有人站在用户体验的角度思考问题。一张页面被打印出来,我们暂且不管他是如何被打印出来的,但是它输出来的就是一段控制浏览器显示的脚本而已。的确就是这么简单,但是输出的页面也是有很多名堂在里面的。例如色彩的选择,功能模块的位置,合理的用户提示等等都至关重要。

通常站点我们都用CSS控制页面样式,JS控制客户端流程,通过对Http请求时间及加载顺序的分析得出以下结论:样式表和客户端脚本尽量放在页面顶部。这样在网络拥塞的时候就会避免很多尴尬的局面。我做过试验,把CSS、JS都在页面尾部加载,并在服务器加上高负载。打开这个页面就会开始出现一堆乱七八糟的文字和色块,晃了一下随后整个页面显示正常。页面是从上到下的顺序加载,每当碰到一个新的HttpRequest就开启另一个新的线程请求资源,从而形成一个并行请求队列。可想而知如果CSS、JS拿不到页面可不就出来一堆你不想看到的东西。
static response
我自认为有一个很好的小窍门,尤其是对HttpRequest限制的非常严格的站点。事出一次在闲逛某网站,发现这个站点非常奇怪,从一个页面跳到另一个相似页面,根本没看到怎么变过来的,也就是我们通常说的反应时间非常短。后来查看HttpRequest发现只有一两个请求,当然设计的时候我们也应该尽量避免不必要的请求,例如可以把所有用到的小图标底图都做到一张图上,从文档中明明看到很多资源请求,百思不得其解!最后跟踪每一个资源请求,分析Http Headers,很快就找到原因,在头文件里包含Etag和Expires,通过对任意资源设置过期时间及服务器标记。一般像JS、CSS、图片都可以设置为不过期,一旦这种资源拿到浏览器后就会缓存下来,就再发生新的请求,所以出现开始的那一幕。有人问我:要是我的JS修改过怎么办呢?我是这么解决的,在资源文件加上时间戳,就像:<link type="text/css" rel="stylesheet" href="source/styles.css?c=200811140001"/>

Ajax很早就有了,现在基本什么网站都有用到。通过大量实例得出以下结论,大多数Ajax可以通过设置缓存时间大大减少后端负荷。关键业务(涉及到资金控制,订单处理等)阿贾克斯能不用就不用,如果确实可以改善效率的我们就通过Get方式请求。当然在很多用户体验方面阿贾克斯有着不可替代的地位!

网络时代给我们带来了什么

是网络改变了我们呢,还是我们改变了网络,是非难辨!就像网络办公之前,有人预测网络办公将大大节省成本,例如在办公耗纸这一项就可以减去不小开支。事实确相反,网络化建设加快了纸张的消耗速度,因为出现了打印机。据官方统计网络办公平均增加近三倍的纸张消耗。但是我想网络时代至少改变了我们的生活方式。如果从一个大型站点的架构来看,网络解决方案正悄然改变着我们的架构方式。也一次又一次的给我带来惊喜,例如智能DNS,CDN,各种网络硬件设施的诞生等都是我们的福音。不过我喜欢通过软件的方式实现各种网络部署方案,也会尝试各种搭配的性能指标。最近看到一篇文章Install WordPress on WEMP (Windows, nginx, MySQL and PHP),实用性很强,我稍做了一些改良,还没做指标测试,感觉效果已经很明显了。国内文章也有很多类似结论:在高并发连接的情况下,Nginx是Apache服务器不错的替代品。Nginx同时也可以作为7层负载均衡服务器来使用。Nginx 可以承受3万以上的并发连接数,相当于同等环境下Apache的10倍。接触Nginx之前,我喜欢用Squid参与网络部署。看到Nginx的简洁配置,高可用性的特性我几乎要放弃Squid,虽然还是有点不舍得。

开源也是一种境界

曾经有人问佛祖:世间什么最珍贵?佛日:得不到的和已经失去的。很久以前我搞不清楚免费的和开源的有什么区别?在XX官网下载一个开源代码,用起来很爽,以为自己得到了一切,激动了一宿,一堆横七竖八的地编码也许一个月后分文不值。但是一个好的开源思想却能永久保留,甚至影响你的一生。 实际上没有这些好的开源项目作支撑或作辅助,一个团队很难在短时间内完成高质量的大型网站。

例如在CSS,JS浏览器兼容方面,说实在的这一直是我比较头痛的问题,但是现在有很多开源的框架和Demo,例如Jquey在这面做的相当好。基本上他们的所有效果我们都有测试过,非常棒!上个大型站点结束的时候,有开发人员跟我开玩笑说,我们整个这个站点就像是Jquey的官方经典案例站点。像Prototype/Jquery/Lucene.Net/NHibernate/CAS/Asp.Net MVC之前都有深入研究过,收益颇多。大概这么像这样的开源框架、项目还有很多很多...我正有这个打算把我所经历过的开源项目都拿出来分享,因为我太喜欢它们了。

时势在先,英雄在后。IBM是大型机时代的典范,Microsoft是PC时代的英雄,而现在的网络时代则塑造了雅虎、谷歌神话。未来无人知晓,但是我想我们每个人都正在历经网络神化传奇!

posted on 2008-11-14 10:03  JerryChang  阅读(2311)  评论(17编辑  收藏  举报