具体描述
《高扩展性网站的50条原则》给出了设计高扩展网站的50条原则,如不要过度设计、设计时就考虑扩展性、把方案简化3倍以上、减少DNS查找、尽可能减少对象等,每个原则都与不同的主题绑定在一起。大部分原则是面向技术的,只有少量原则解决的是与关键习惯和方法有关的问题,当然,每个原则都对构建可扩展的产品至关重要。
主要内容包括:
通过克隆、复制、分离功能和拆分数据集提高网站扩展性;
采用横向扩展方案代替纵向扩展;
在不损害网站可扩展性的前提下,最大程度地利用数据库;
避免不必要的重定向和冗余的二次检查;
在不引入复杂性的前提下,更加充分地使用缓存和内容分发网络;
要求网站设计具备容错、优雅降级和易回滚的功能;
设计系统时尽可能选择无状态实现,如果确实需要状态,做到合理高效;
有效利用异步通信;
无论你的网站刚刚起步,还是正在设计开发过程中,或者已经成熟运转了很长时间,你都能从书中找到很有针对性的指导原则,提高网站的可扩展性。
作者简介
作者简介:
Martin L. Abbott
业界资深管理者,曾参与管理过多家世界500强企业和创业公司。AKF Partners公司创始人。曾任Quigo公司首席运营官(该公司后被AOL收购),eBay公司高级副总裁和首席技术官,还曾在Gateway和摩托罗拉担任重要职位。现任多家技术公司董事,多所高校、公共机构以及私企的咨询顾问。Martin分别于西点军校和佛罗里达大学取得计算机学士和硕士学位,并参加过哈佛大学商学院高级经理培训,目前在西储大学攻读博士学位。
Michael T. Fisher
业界资深管理者,曾参与管理过多家世界500强企业和创业公司。AKF Partners公司创始人。曾任Quigo公司首席技术官、总裁,PayPal公司工程和架构部门副总裁。曾在通用电器工作7年,帮助制定公司的技术战略。目前担任多家私企和非营利机构的董事和顾问。Michael毕业于西点军校,是六西格玛黑带大师,目前在西储大学攻读博士学位。
目录信息
第1章 化简方程 1
1.1 原则1:不要过度设计 2
1.2 原则2:设计时就考虑扩展性(D-I-D方法) 6
1.2.1 设计 7
1.2.2 实现 8
1.2.3 部署 8
1.3 原则3:把方案一简再简 10
1.3.1 如何简化范围 10
1.3.2 如何简化设计 11
1.3.3 如何简化实施 12
1.4 原则4:减少DNS查找 13
1.5 原则5:尽可能减少对象 16
1.6 原则6:使用同一品牌的网络设备 19
1.7 小结 21
参考资料 21
第2章 分布工作 23
2.1 原则7:横向复制(X轴原则) 25
2.2 原则8:拆分不同的东西(Y轴原则) 29
2.3 原则9:拆分相近的东西(Z轴原则) 32
2.4 小结 34
参考资料 34
第3章 横向扩展设计 35
3.1 原则10:设计横向扩展方案 36
3.2 原则11:采用经济型系统 39
3.3 原则12:横向扩展数据中心 42
3.4 原则13:利用云技术进行设计 48
3.5 小结 50
参考资料 50
第4章 使用正确的工具 51
4.1 原则14:合理使用数据库 52
4.2 原则15:防火墙,到处都是防火墙 59
4.3 原则16:积极利用日志文件 63
4.4 小结 66
参考资料 66
第5章 不要重复工作 67
5.1 原则17:不要立即检查刚做过的工作 68
5.2 原则18:停止重定向 72
5.3 原则19:放松时序约束 77
5.4 小结 80
参考资料 80
第6章 积极利用缓存 81
6.1 原则20:利用CDN 82
6.2 原则21:使用过期头 85
6.3 原则22:缓存Ajax调用 90
6.4 原则23:利用页面缓存 95
6.5 原则24:利用应用缓存 98
6.6 原则25:利用对象缓存 102
6.7 原则26:把对象缓存放在自己的“层”上 105
6.8 小结 107
参考资料 107
第7章 从错误中吸取教训 109
7.1 原则27:积极地学习 110
7.2 原则28:不要依靠QA发现失误 113
7.3 原则29:没有回退功能的设计是失败的设计 117
7.4 原则30:讨论失败并从中吸取教训 120
7.5 小结 124
参考资料 124
第8章 数据库原则 125
8.1 原则31:注意代价高的关系 126
8.2 原则32:使用类型正确的数据库锁 130
8.3 原则33:不要使用多阶段提交 133
8.4 原则34:不要使用SELECT FOR UPDATE 135
8.5 原则35:不要选择所有数据 137
8.6 小结 140
参考资料 140
第9章 容错设计与故障控制 141
9.1 原则36:采用隔离故障的“泳道” 142
9.2 原则37:绝对不要信任单点故障 148
9.3 原则38:避免系统串联 151
9.4 原则39:确保能够启用/禁用功能 155
9.5 小结 158
第10章 避免或分发状态 159
10.1 原则40:努力实现无状态 161
10.2 原则41:尽可能在浏览器端维护会话 164
10.3 原则42:利用分布式缓存存放状态 167
10.4 小结 170
参考资料 170
第11章 异步通信和消息总线 171
11.1 原则43:尽可能使用异步通信 172
11.2 原则44:确保消息总线能够扩展 175
11.3 原则45:避免让消息总线过度拥挤 179
11.4 小结 182
第12章 其他原则 183
12.1 原则46:慎用第三方解决方案扩展 184
12.2 原则47:清除、归档和成本合理的存储 187
12.3 原则48:删除事务处理中的商业智能 192
12.4 原则49:设计能够监控的应用 195
12.5 原则50:要能胜任 199
12.6 小结 202
参考资料 202
第13章 原则回顾和优先级划分 203
13.1 评估扩展项目和主动权的风险?收益模型 204
13.2 扩展原则的收益/优先级等级 235
13.3 小结 238
· · · · · · (收起)
读后感
基本大型网站架构注意事项都有所提及。不能作为入门书籍,对于有过大型网站实践经验,回头来看这些原则觉得都是非常合理。这本书完全当作床头读物,在网站架构技术选型之时,里面一些原则可以作为参考。 全书下来印象比较深刻的还是AKF法则,构建大型网站说白了还是在...
《高扩展性网站的50条原则》给出了设计高扩展网站的50条原则,如不要过度设计、设计时就考虑扩展性、把方案简化3倍以上、减少DNS查找、尽可能减少对象等,每个原则都与不同的主题绑定在一起。大部分原则是面向技术的,只有少量原则解决的是与关键习惯和方法有关的问题,当然,...
有些原则有凑数之嫌,例如原则34,35,更像是性能方面的注意事项,和高扩展性就谈不上边了。 真正和扩展性紧密挂钩的是原则7/8/9,遗憾的是描述太原则化,缺乏案例更好的诠释。 最后呢,出版社通过译名硬是跟高扩展性拉上关系,想通过本书要对高扩展性有所了解的恐怕要失望了。
有些原则有凑数之嫌,例如原则34,35,更像是性能方面的注意事项,和高扩展性就谈不上边了。 真正和扩展性紧密挂钩的是原则7/8/9,遗憾的是描述太原则化,缺乏案例更好的诠释。 最后呢,出版社通过译名硬是跟高扩展性拉上关系,想通过本书要对高扩展性有所了解的恐怕要失望了。
讲真,看完这本书没有什么感触;就像看完面向对象分析与设计一样;我看这部分的豆平其实马马虎虎,7.4;其实在我们公众号,infoQ,csdn信息泛滥的时代,拿出这本真经里面任何一条似乎都能搜到一大把的文章;但是,没有一篇文章能够把他们穿起来。 是的,这本书其实和《面向对象...
用户评价
读完这本书,我感觉自己像是获得了一次“内功心法”的修炼。之前写代码,总是在“招式”上下功夫,追求功能的实现和眼前的效率。这本书则让我看到了“内功”的重要性,那些看似抽象的原则,实则是在为网站的长期健康发展打下坚实的基础。书中的一些讨论,比如“数据一致性”和“最终一致性”的权衡,让我深刻理解了在分布式环境下,设计决策的复杂性和取舍。我以前以为数据库的ACID是万能的,但这本书让我明白,在追求高可用性和高性能的情况下,有时候需要接受一些“妥协”。 这本书的价值在于,它不是简单罗列技巧,而是通过深入的原理分析,引导读者去理解背后的逻辑。我尤其喜欢书中对于“缓存策略”的探讨,从 CDN 到应用层缓存,再到数据库缓存,它详细地讲解了不同层级缓存的适用场景、失效机制以及如何设计有效的缓存淘汰策略。这让我不再盲目地堆砌缓存,而是能够根据具体的业务需求,选择最合适的缓存方案,从而显著提升网站的响应速度。更重要的是,它让我学会了如何在追求性能的同时,平衡数据的新鲜度和一致性,这在很多高并发场景下都是至关重要的考量。
我得说,这本书的内容简直是给我打开了新的视野,让我意识到原来构建一个能够抵御流量洪峰、并且能够灵活应对未来变化的网站,远比我想象的要复杂和精妙。在读这本书之前,我总觉得,网站的扩展性问题,无非是加几台服务器、优化一下数据库查询。但这本书彻底颠覆了我的这种浅显的认知。它深入探讨了从基础设施到应用层,再到数据存储的方方面面,给出了许多非常具体且具有指导意义的原则。 其中,关于“异步处理”和“消息队列”的章节,让我印象尤为深刻。我之前总是倾向于使用同步调用来完成任务,这样虽然简单直接,但在高并发场景下,很容易造成资源的堆积和请求的超时。这本书则详细讲解了如何利用消息队列将耗时的操作解耦,让前端请求能够快速响应,后台再进行异步处理。这不仅提升了用户体验,也大大提高了系统的吞吐量和健壮性。另外,书中关于“负载均衡算法”的介绍,也让我对如何将流量公平有效地分配到各个服务器有了更深入的理解,不再是简单的轮询,而是考虑了服务器的负载、响应时间等多种因素。
我一直认为,一个好的网站,不仅仅是要“能用”,更重要的是要“好用”,并且能够在时间的考验下保持稳定和高效。这本书就是这样一本能够帮助我们实现这个目标的指南。它没有贩卖焦虑,而是以一种非常务实和系统的方式,为我们讲解了如何打造一个真正“高扩展性”的网站。书中的一些案例分析,虽然没有直接展示代码,但通过对问题成因的剖析和解决方案的阐述,让我能够清晰地看到那些优秀架构的影子。 最让我受益匪浅的是,书中关于“监控与告警”的重要性被反复强调。之前我总觉得,网站能跑就行,出了问题再说。但这本书让我明白,主动的监控和及时的告警,是发现潜在问题、预防系统崩溃的关键。它详细讲解了需要监控哪些关键指标,如何设置合理的告警阈值,以及如何利用监控数据来指导优化决策。这让我开始重新审视自己的项目,并着手建立一套更完善的监控体系。此外,书中关于“版本兼容性”和“渐进式发布”的讨论,也让我意识到,在迭代开发的过程中,如何尽量减少对现有用户的影响,也是高扩展性的一部分。
这本书的价值,在于它提供了一个宏观的视角,让我们能够从更高的维度去审视网站的架构设计和开发实践。在阅读之前,我对于“可扩展性”的理解,更多地是集中在一些技术细节上,比如数据库索引的优化、CDN 的使用等等。但这本书却将这些零散的知识点串联起来,形成了一个完整的知识体系。它让我明白,真正的高扩展性,是一个系统工程,需要从设计理念、架构模式、技术选型到开发流程等多个层面进行考量。 我尤其欣赏书中关于“可读性”和“可维护性”与“可扩展性”之间关系的论述。以往我可能更倾向于追求性能上的极致,而忽略了代码的可读性和可维护性。但这本书告诉我,一个难以阅读和维护的代码库,即使短期内性能再高,也无法真正实现长期的可扩展性,因为一旦出现问题,将很难进行修改和优化。书中关于“代码规范”和“文档编写”的强调,让我意识到,这些看似基础的工作,对于保障网站的可扩展性至关重要。它让我明白,写出易于理解和修改的代码,才能为未来的迭代和扩展打下良好的基础。
这本书就像一本宝藏图,为我指引了一条通往更高质量网站开发的清晰路径。在我刚开始接触网站开发的时候,总感觉自己像是在黑暗中摸索,虽然能搭建起一个能用的网站,但总是在性能、可维护性、以及面对用户增长时的瓶颈处感到力不从心。这本书的出现,彻底改变了我的认知。它没有直接给我“菜谱”,而是教会了我“烹饪的哲学”。每一条原则都像是一次深刻的启迪,让我开始思考“为什么”这样做,以及“这样做”的长期影响。 例如,关于“松耦合”的讨论,我之前只是大概知道要模块化,但这本书却从架构设计的角度,深入剖析了如何通过接口、依赖注入等方式,构建一个即便未来需求变更,也能轻松替换或扩展某个模块的系统。这让我意识到,一个“高扩展性”的网站,不仅仅是代码写得快,更重要的是它拥有一个健壮、灵活的骨架。我开始在项目评审时,主动提出关于架构设计的建议,不再仅仅关注功能的实现。书中关于“水平扩展”的阐述,更是让我眼前一亮,之前我对“可扩展”的理解仅仅停留在单机性能提升,而这本书则打开了我对分布式系统和负载均衡的视野,让我理解了如何通过增加更多的服务器来应对海量用户。
相当一般,没什么干货,还很啰嗦
很多地方论证不足,信息片面,不大建议新人读。
50,胜任能力及原则优先级为我们做了很好的指引,对网站开来说应好好研究并应用这些原则!
入门级读物
比较系统的阐述了些网站、后端设计的原则,有很多点总结的很好,比较适合有一定项目经验的人,总结提高一下项目架构、设计时候需要注意的事情。项目经验多的人可能只需要浏览一下,有没听过不熟悉的章节再仔细阅读,大部分可以草草看罢。