我读的是扫描版的PDF版本,此书出版于2013年9月,距离现在已经4年多,但对于我来说,依然新鲜。书中的许多内容虽耳熟能详,但从未形成系统。以此笔记,感谢作者,也为自己留点资料。
前事不忘,后事之师。念念不忘,必有回响
理论基础:
大型网站核心架构要素: 性能、 可用性、伸缩性、扩展性、安全性
网站的价值在于它能为用户提供什么价值,在于网站能做什么,而不是在于它是怎么做的,所以在网站还是很小的时候就去追求网站的架构是舍本逐未,得不偿失的。小型网产上最需要做的就是为用户提供好的服务来创造价值,得到用户的认可,活下去,野蛮生长。
产品在设计之初就需要一个明解的定位:什么是产品要实现的功能,什么不是产品提供的特性。在产品漫长的生命周期中,会有形形色色的困难和诱惑来改变产品的发展方向,左右摇摆。什么都想做的产品,最后有可能成为一个失去生命力的四不像
归根结底,技术是为业务服务的,技术选型和架构决策依赖业务乃至企业的业务上战略规划,离开业务发展的支撑和驱动,技术走不远,甚至会迷路
简单的三层架构:应用层,服务层,数据层。
无状态的服务(session记录状态),无状态的对象(代码级别)
服务的幂等性设计
CAP原理,认为一个提供数据服务的存储系统无法同时满足数据一致性、数据可用性、分区耐受性这三个条件。
自动化发布、灰度发布
监控数据采集,监控管理。事物的发展总是先求生存,再求发展,保证网站可用,万无一失,任重而道远
计算机的任何ukdj下周都可以通过增加一个虚拟层来解决
一个良好申缩性架构设计的网站,其设计总是走在业务发展的前面,在业务需要处理更多访问和服务之前,就已经做好准备,当业务需要时,只需要购买或租用服务器简单部署实施就可以了。技术团队亦可高枕无忧。
高手定律:这个世界只有遇不到的问题,没有解决不了的问题。高手之所以成为高手,是因为他们遇到了常人很难遇到的问题,并解决了。
-
关于扩展性和申缩性:
- 扩展性:指对现有系统影响最小的情况下,系统功能可持续扩展或提升的能力。表现在第ixyc基础设施稳定,不需要经常变更,应用之间较少依赖和耦合,对需求变更可以敏捷响应。它是系统架构设计层面的开闭原则(对扩展开放,对修改关闭),架构设计考虑未来功能扩展,当系统增加新功能时,不需要对现有系统的结构和代码进行修改
- 申缩性:指系统能够增加(或减少)自身资源规模的方式,增强(减少)自己计算处理事务的能力。如果这种增减是成比例的,就被称作线性伸缩性。在网站架构中,通常指利用集群的方式增加服务器数量、提高系统的整体事务吞吐能力。
网站安全性相关:防御应用攻击 、信息加密和密钥安全、信息过滤和反垃圾、电子商务的风控
没有绝对的安全,正如没有绝对的自由一样。网站的相对安全是通过提高攻击门槛达到的。
故障举例:
- 写日志引发故障:磁盘空间不足
- 高并发访问数据库引发故障:高频访问页面静态化
- 高并发情况下锁引发的故障:锁操作要永远谨慎
- 缓存引发的故障:当缓存已经成为网站架构不可或缺的一部分时,对缓存的管理就要提高到和其它服务器一样的级别
- 应用启动不同步引发的故障:注意校验服务启动的顺序
- 大文件独占磁盘引发的故障:存储的使用需要根据不同文件类型和用途进行管理。比如大、小文件独立存储
- 滥用生产环境引发的故障:访问线上生产环境要规范、专人专管
- 不规范的流程引发的故障:代码提交前使用diff工具进行比较,确认没有提交不该提交的代码。加强code review
- 不好的编程习惯引发故障:程序在处理输入对象时,需要校验
架构师篇
关注人而不是关注产品
一定要坚信:一群优秀的人做一件他们热爱的事,一定能取得成功。不管过程多么曲折,不管外人看来有多么不可思议不靠谱
所以最好 的软件项目管理不是制订计划,组织资源,跟踪修正项目进展,对成员进行激励和惩罚,而是发掘项目组每个成员的优秀潜能,让大家理解并热爱软件产品最终的蓝图和愿景。每个人都是为实现自我价值而努力,不是为了领工资而工作。
一旦做到这一点,项目组每个成员都会自我驱动,自觉合作,寻找达成目标的最优路径,并坚韧不拔的持续前进。整个过程,不需要拙劣的胡萝卜和大捧,最好的奖励就是最终达成的目标本身,最大的惩罚就是这个美好的目标没有实现。
这也是领导的真谛:寻找一个值得共同奋斗的目标,营造一个让大家都能最大限度发挥自我价值的工作氛围。
没有懒惰的员工,只有没被激发出来的激情。所有强迫员工加班的管理都,都应该为自己的无能而羞愧
发掘人的优秀
是事情成就了人,而不是人成就了事。
发掘人的优秀比发掘优秀的人更有意义
共享美好蓝图
- 蓝图应该是表述清楚的:产品要做什么,不做什么,要达到什么业务目标
- 蓝图应该是形象的:产品能为用户创建什么价值、能实现什么样的市场目标、产品最终会长什么样,都需要能形象想像出来
- 蓝图应该是简单的:不管内部还是外部沟通,都能一名话说明白:我们在做什么。
在项目过程中,架构师要保持对目标蓝图的关注,对任何偏离蓝图的设计和决定保持警惕,错误的偏离要及时修正,必要的变更经大家讨论,并需要重新获得大家的认同。
共同参与架构
- 不要只有架构师一个人捅有架构
- 让其他人维护框架与架构文档
学会妥协
不要企图在项目中证明自己是正确的,一定要记住,你是来做软件的,不是来当老大的。
成就他人,成就自己
活着不是为了工作,为是为了设计、写程序,这些不是我们生活的目的。我们活着是为了成就我们自己,有原则要想成就自己,就必须首先成就他人。
每个人都有自己成就的目标,而工作是达成自我成就的一种手段:通过工作的挑战,发掘自我的潜能,重新认知我和世界。
职场
- 把“我的问题”表述成"我们的问题“
- 给上司提封闭式问题,给下属提开放式问题
- 指出问题而不是批评人
- 用赞同的方式提出问题。(所谓直言有讳是指想要表达的意图要直截了当说明白,不要兜圈子,但是在表达方式上要有所避讳,照顾到当事人的感受。)
- 在解决我的问题之前,先解决你的问题
- 适当的逃避问题
大型网站架构技术一览
- 前端架构
浏览器优化技术、CDN、动静分离、图片服务、反向代理、DNS - 应用层架构
应用层是处理网站主要业务逻辑的地方
开发框架、页面渲染、负载均衡、Session管理、动态页面静态化、业务拆分、虚拟化服务器
- 服务层架构
提供基础服务,供应用层调用,完成网站业务
分布式消息、分布式服务、分布式缓存、分布式配置
存储层架构
提供数据、文件的持久化存储访问和管理服务
分布式文件、关系数据库、NoSql数据库、数据同步后台架构
网站应用中,除了要处理用户实时访问请求外,还有一些后台非实时数据分析要处理。
搜索引擎(站内)、数据仓库、推荐系统数据采集与监控
浏览器数据采集、服务器业务数据采集、服务器性能数据采集、系统监控、系统警报安全架构
web攻击、数据保护数据中心机房架构
机房架构、机柜架构、服务器架构
后记:
这是一本讲大型网站架构设计的书,但是大型网站不是设计出来的,而是逐步演化出来的。所以,不要企图去设计一个大型网站。
互联网正在并将继续改变这个世界,一切才刚刚开始,你我正生缝其时。