图书信息作者:郭欣 著

出 版 社: 电子工业出版社
出版时间: 2009-8-1
页数:420页
开本: 16开
I S B N :9787121093357
定价:59.00元
内 容 简 介本书围绕如何构建高性能Web站点,从多个方面、多个角度进行了全面的阐述,涵盖了Web站点性能优化的几乎所有内容,包括数据的网络传输、服务器并发处理能力、动态网页缓存、动态网页静态化、应用层数据缓存、分布式缓存、Web服务器缓存、反向代理缓存、脚本解释速度、页面组件分离、浏览器本地缓存、浏览器并发请求、文件的分发、数据库I/O优化、数据库访问、数据库分布式设计、负载均衡、分布式文件系统、性能监控等。在这些内容中充分抓住本质并结合实践,通过通俗易懂的文字和生动有趣的配图,让读者充分并深入理解高性能架构的真相。同时,本书充分应用跨学科知识和科学分析方法,通过宽泛的视野和独特的角度,将本书的内容展现得更加透彻和富有趣味。
前 言从我写出第一个HTML网页到现在,已经过去10年多的时间了,回顾过去的Web开发经历,我曾经尝试过各种不同的技术,与此同时,我和我的团队也犯了很多的错误,但我们为此感到自豪。是的,成长是需要不断付出代价的,每次的挫折都会让我更加深刻地看到隐藏在深处的本质,为什么不把这些内容分享出来呢?于是便有了《构建高性能Web站点》这本书。
10年来,我们见证了互联网有史以来最快速的发展,商业应用层出不穷,业务逻辑不断复杂,对用户体验的要求也不断提升,随之而来的是应用技术和开发语言的日新月异,开发者永不停息地学习新技术。同样,在Web站点性能方面,我们一直在跟时间赛跑,社交网站和微博客成为大众的主流应用,带来了更加快速、实时的信息传递,更多的站点意识到开放的重要性,数据访问和计算无处不在,每秒数以万次的数据传递和读写正在我们身边进行。
但是,构建Web站点的基础技术几乎多年来从未改变,比如诞生于20世纪80年代的TCP,如今依旧是网络数据传输的主宰者,而HTTP则更与我们息息相关,可是你真的认真学习过它们吗?人们始终在做的事情就是在这些基础技术之上一层一层地封装概念,不断地诞生新的技术。加上商业化产品的市场竞争和炒作,.NET和Java阵营中的概念让我眼花缭乱却又无可奈何。它们已经成为营销用语,有时候过度会让事情变得更加复杂,让开发者迷失方向。
不论你是一名从事Web开发的工程师,还是一名关心Web性能的架构师,都应该更多地关注各种技术和架构的本质。
从哲学意义上讲,对本质的研究属于形而上学的范畴,但是在自然科学中,我们从来不缺乏对本质的探索,因为只有认识事物的本质才能做出正确的决策,并且真正地驾驭它们,这是毫无争议的。
也许你曾经被商家的促销活动所打动。是的,我们往往只看到事物的表面现象,而经济学家却看到了事物的本质,这正是他们的高明之处。技术和架构同样如此,你要明白任何收获都是有代价的,天下没有免费的午餐,很多时候,你完全可以用成本经济学的知识来思考技术的合理性,你甚至可以像经济学家一样思考技术问题。
当然,仅仅理解本质是远远不够的,因为在庞大的架构体系中,涉及太多的部件,而影响整体性能的因素究竟有哪些呢?你也许会感到扑朔迷离,但你必须知道瓶颈所在,并且能够意识到何时需要优化性能或者扩展规模。与此同时,系统化的分析方法至关重要,中医理论对人体的系统思辨能力体现了先哲们的智慧,在站点性能不尽如人意的时候,我们能否“对症下药”?这与你对整个系统能否全面把握有着密切的关系。
另一方面,绝对与相对、变化与平衡,是永恒的大道,在很多时候你实际上需要考虑的是如何做出权衡,同时,我们也要铭记变化的道理,系统瓶颈不是一成不变的,久经考验的架构师深知这一点。
道可道,非常道。要将所有的架构之道讲出来实属不易,架构就像艺术品一样,往往无法完全复制,但是独立的技术以及分析的思路是可以学习的,作为优秀的开发者或者架构师,心中的架构才是最有价值的。
如果你希望寻找心中的架构,那么,从本书的绪论开始吧!
读者群
如果你希望学习如何创建一个Web站点,那么这本书可能并不适合你,但是当你对站点的性能开始担忧时,欢迎你的归来。
这本书适合以下读者:
编写Web应用程序、关心站点性能,并且希望自己做得更加出色的开发人员
关心性能和可用性的Web架构师
希望构建高性能Web站点的技术负责人
实施Web站点性能优化或者规模扩展的运维人员
与Web性能有关的测试人员
的确,整个技术团队的所有成员都适合阅读这本书。另外,高校学生以及个人网站站长也可以阅读,笔者希望本书可以帮助他们开拓视野。
如何阅读
本书涉及大量的软件和工具,由于篇幅有限,书中并没有对它们的具体使用方法展开详细的介绍,你可以通过Google查找相关的在线手册来进行自学,同时,在本书的参考文献列表和配套Blog中,也会提供一些相关链接。
本书不想在阐释体系上束缚读者的天分,所有内容的安排更像是引导你身处Web站点的各个角落,与影响性能的各种因素自由碰撞,并且一步步地思考和分析问题。所以,你也许不会直接找到一个高性能Web站点的完整解决方案,但是,当你认真地依次阅读完本书的所有章节后,你也许会找到你更想要的东西,并从中获益,我衷心希望如此。
如果没有什么特殊的原因,还是建议你能够按照章节顺序,心平气和地通读一遍,因为在内容组织上,本书有太多的连贯性设计,我担心随机阅读会让你的收益大打折扣。
创作过程
说到这次写书的过程,我同样感到很有意义,各种全新的尝试让创作过程充满乐趣,它们同样值得分享。
不同于传统使用Word编写内容,我使用了快捷的Google在线文档,并使用在线表格保存测试数据,它们支持出色的版本管理,并且提供快速的分享和协作功能。当然,最激动人心的莫过于我可以在任何地点通过浏览器继续我的写作过程,甚至当灵感突如其来时打开Google G1手机便可以写上两句。
对于几十万字的篇幅,一气呵成绝对是不可能的,多次迭代必然贯穿整个写作过程,从灵感到提纲,再从框架到最终文字,虽然没有完善的过程管理,但是我时刻能感觉到敏捷的火花。
为了尽早地获得读者的反馈,我考虑尽早“部署”,于是选择了讨论组和邮件列表的方式,在Google Group上创建了读者讨论组,上传了一些试读章节,收集到了大量的修改意见和想法,这些都是我所需要的,同时也给我带来了鼓励和支持。
整个过程还有很多的花絮,这里就不一一介绍。创作的过程是艰辛的,需要作者的坚持和毅力,虽然创作本身没有捷径,但是我们可以让创作过程更加充满乐趣,让作者和读者更加近距离地接触。
当我将这些过程介绍给一些朋友时,他们感到很有意思,于是我们创立了SmartDeveloper系列,希望能够将这种敏捷写作过程进一步整理和完善,当然,《构建高性能Web站点》将作为该系列的开山之作。
值得一提的是,为本书撰写推荐序的王速瑜先生在敏捷开发领域有着丰富的经验,并在腾讯公司内部积极推广敏捷开发平台和方法。长久以来,我认为我们都是敏捷原住民,骨子里充满了敏捷的思想和战斗力。不可否认,敏捷给我带来了无法估量的收获。幸运的是,他也计划写一本关于敏捷开发的书,总结他的实战经验,并且加入SmartDeveloper系列,我也非常期待这本书的问世。
致谢
感谢我的父母,他们在我读初中的时候送给我第一台电脑(Cyrix1.66G的兼容机),让我走进了计算机的世界,并且给予我非常多的支持和鼓励,让我毫无顾虑地追逐梦想。
感谢我的Cris,她为我创作了本书的封面,并且在整个写作过程中毫无抱怨地陪伴我,给予我无尽的支持和灵感。
感谢电子工业出版社的策划编辑李冰和文字编辑江立,她们严谨认真的工作态度以及作为出版商的开放态度让我深感敬佩。
感谢为本书撰写推荐序的王速瑜先生,以及撰写评价的章文嵩博士、张松国先生、沈翔先生、朱鑫先生,他们在繁忙的工作中抽出时间,阅读了本书的样稿并写下了推荐和评价。特别一提的是,章文嵩博士对书中一些内容的理解和建议让我受益匪浅。
感谢对本书提出宝贵修改意见的朋友,他们是蒋琦、丁吉亮、汤文亮、刘健、朱李、周伟强。
感谢在读者讨论组中所有积极阅读试读内容并提出意见的成员。
目 录第1章 绪论 1
1.1 等待的真相 1
1.2 瓶颈在哪里 2
1.3 增加带宽 3
1.4 减少网页中的HTTP请求 4
1.5 加快服务器脚本计算速度 4
1.6 使用动态内容缓存 5
1.7 使用数据缓存 5
1.8 将动态内容静态化 6
1.9 更换Web服务器软件 6
1.10 页面组件分离 7
1.11 合理部署服务器 7
1.12 使用负载均衡 8
1.13 优化数据库 8
1.14 考虑可扩展性 9
1.15 减少视觉等待 10
第2章 数据的网络传输 11
2.1 分层网络模型 11
2.2 带宽 22
2.3 响应时间 28
2.4 互联互通 33
第3章 服务器并发处理能力 35
3.1 吞吐率 35
3.2 CPU并发计算 49
3.3 系统调用 60
3.4 内存分配 63
3.5 持久连接 65
3.6 I/O模型 68
3.7 服务器并发策略 81
第4章 动态内容缓存 96
4.1 重复的开销 96
4.2 缓存与速度 98
4.3 页面缓存 98
4.4 局部无缓存 112
4.5 静态化内容 112
第5章 动态脚本加速 121
5.1 opcode缓存 121
5.2 解释器扩展模块 132
5.3 脚本跟踪与分析 133
第6章 浏览器缓存 143
6.1 别忘了浏览器 143
6.2 缓存协商 147
6.3 彻底消灭请求 160
第7章 Web服务器缓存 167
7.1 URL映射 167
7.2 缓存响应内容 168
7.3 缓存文件描述符 175
第8章 反向代理缓存 178
8.1 传统代理 178
8.2 何为反向 179
8.3 在反向代理上创建缓存 180
8.4 小心穿过代理 202
8.5 流量分配 204
第9章 Web组件分离 205
9.1 备受争议的分离 205
9.2 因材施教 206
9.3 拥有不同的域名 207
9.4 浏览器并发数 210
9.5 发挥各自的潜力 212
第10章 分布式缓存 220
10.1 数据库的前端缓存区 220
10.2 使用memcached 221
10.3 读操作缓存 225
10.4 写操作缓存 229
10.5 监控状态 232
10.6 缓存扩展 234
第11章 数据库性能优化 238
11.1 友好的状态报告 239
11.2 正确使用索引 241
11.3 锁定与等待 255
11.4 事务性表的性能 263
11.5 使用查询缓存 264
11.6 临时表 266
11.7 线程池 266
11.8 反范式化设计 267
11.9 放弃关系型数据库 269
第12章 Web负载均衡 272
12.1 一些思考 272
12.2 HTTP重定向 275
12.3 DNS负载均衡 284
12.4 反向代理负载均衡 292
12.5 IP负载均衡 305
12.6 直接路由 317
12.7 IP隧道 325
12.8 考虑可用性 325
第13章 共享文件系统 328
13.1 网络共享 328
13.2 NFS 330
13.3 局限性 335
第14章 内容分发和同步 337
14.1 复制 337
14.2 SSH 338
14.3 WebDAV 342
14.4 rsync 342
14.5 Hash tree 344
14.6 分发还是同步 345
14.7 反向代理 346
第15章 分布式文件系统 348
15.1 文件系统 348
15.2 存储节点和追踪器 350
15.3 MogileFS 352
第16章 数据库扩展 362
16.1 复制和分离 362
16.2 垂直分区 366
16.3 水平分区 367
第17章 分布式计算 374
17.1 异步计算 374
17.2 并行计算 379
第18章 性能监控 384
18.1 实时监控 384
18.2 监控代理 386
18.3 系统监控 388
18.4 服务监控 391
18.5 响应时间监控 393
参考文献 397
索引 399