## 第一篇: 概述
## 第一章: 大型网站的演化
### 1.1 大型网站软件系统的特点
高并发, 大流量
高可用
海量数据
用户分布广泛, 网络情况复杂
安全环境恶劣
需求快速变更, 发布频繁
渐进式发展
### 2.3 大型网站架构演化发展历程
1) 初始阶段的网站架构
一台服务器搞定一切
2) 应用服务和数据服务分离
分出了应用, 数据, 文件三台服务器. 应用服务器要处理大量的业务, 所以需要更快更强的CPU. 数据服务器快速磁盘检索和数据缓存, 需要更快的硬盘和大内存; 文件服务器用于存储用户的文件, 需要更大的硬盘
3) 使用缓存改善网站性能
遵循2/8定律. 80%的业务访问集中在20%的数据上.
只要缓存住了这20%的数据, 就可以大大减少服务器的读
4) 使用应用服务器集群改善网站的并发处理能力
通过持续增加应用服务器的方式来改善负载压力, 实现系统的可伸缩性.
而不是采购更强的服务器.
5) 数据库的读写分离
配置主从数据库. 应用服务器要写数据时, 访问主数据库. 主数据库通过主从复制机制将数据更新同步到从数据库.
6) 使用反向代理和CDN加速网站响应
基本原理都是缓存. 区别在于CDN部署在网络提供商机房中. 而反向代理部署在网站机房中.
7) 使用分布式文件系统和分布式数据库系统
使用分布式数据库是数据库拆分的最后手段. 更常使用的是业务分库.
8) 使用NoSQL和搜索引擎
通过一个统一的数据层访问各种数据, 减轻应用程序管理诸多数据库的麻烦
9) 业务拆分
将整个网站业务拆分成不同的产品线
10) 分布式服务
### 1.3 大型网站架构演化的价值观
1) 核心价值是随网站所需灵活应对
2) 驱动技术发展的主要力量是业务发展
### 1.4 网站架构设计误区
1) 一味追求大公司的解决方案
2) 为了技术而技术
3) 企图用技术解决所有问题
技术是用来解决业务问题的, 而业务问题, 也可以通过业务的手段去解决
## 第二章: 大型网站架构模式
模式: 问题和场景的可重复带来了解决方案的可重复性
### 2.1 架构模式
1) 分层
将系统在横向纬度上切分成几个部分, 每个部分负责一部分比较单一的职责, 然后通过上层对下层的依赖和调用组成一个完整的系统.
分层架构的挑战: 必须合理规划层次边界和接口, 在开发过程中, 严格遵循分层架构约束, 禁止跨层次的调用以及逆向调用(如数据层调用应用层)
2) 分割
在纵向方面对软件进行切分. 将不同的功能和服务分割开来, 包装成高内聚低耦合的模块单元.
一方面有助于软件的开发和维护; 另一方面, 便于同步模块的分布式部署, 提供网站的并发处理能力和功能扩展能力
分布式
分层和分割的一个主要目的就是为了分布式部署.
### 分布式会带来以下问题:
a. 必须通过网络, 对性能造成影响
b. 服务器越多, 宕机的可能性越大, 使网站的可用性降低
c. 在分布式环境下保证数据的一致性很困难, 分布式事务也难以保证, 对业务正确性和业务流程造成影响
d. 导致网站依赖复杂, 开发管理维护困难
### 常用的分布式:
a. 分布式用用和服务
b. 分布式静态资源
减轻应用服务器负载; 通过独立域名加快浏览器并发加载速度; 由专门用户体验团队维护, 分工更加明确.
c. 分布式数据和存储
d. 分布式计算
Hodoop和MapReduce. 特点是移动计算而不是移动数据, 将计算程序分发到数据所在的位置以加速计算和分布式计算
e. 分布式配置
f. 分布式锁
g. 分布式文件系统
### 集群
使用分布式虽然将分层和分割后的模块独立部署, 但对于用户访问集中的模块(比如首页), 还需要将独立部署的服务器集群化, 即多台服务器部署相同的应用构成一个集群, 通过负载均衡服务器共同对外提供服务.
### 缓存
缓存就是将数据存放在距离计算最近的位置以加快处理速度, 缓存是改善软件性能的第一手段
### 缓存的分类:
CDN: 内容分发网络
反向代理
本地缓存
分布式缓存: Redis Memcached
使用缓存的2个条件:
a. 数据访问热点不均衡, 将热点数据缓存起来
b. 数据在某个时间段内有效, 不会很快过期. 否则缓存的数据会因为失效而产生脏读.
缓存的作用:
a. 加速数据访问速度
b. 减轻后端应用和数据存储应用的负载压力, 这一点对网站数据库架构至关重要. 网站数据库几乎都是按照有缓存的前提进行负载能力设计的
异步
通过消息队列, 将同步的操作编程异步的.
如下特性:
a. 提供系统的可用性
b. 加速网站响应速度
c. 消除并发访问高峰
可能对用户体验和业务流程造成影响.
冗余
### 自动化
a. 发布过程自动化
b. 自动化代码管理
c. 自动化测试
d. 自动化安全检测
e. 自动化部署
f. 自动化监控
g. 自动化报警
h. 自动化失效转移: 将失效的服务器从集群中隔离除去, 不再处理系统中的应用请求
i. 自动化失效恢复: 重新启动服务, 同步数据保证数据一致性
j. 自动化降级: 通过拒绝部分请求及关闭部分不重要的业务将系统负载降至一个安全的水平
k. 自动化分配资源: 将空闲资源分配给重要的服务, 扩大其部署规模
安全
身份认证: 密码, 手机短信
登录,交易等操作需要对网络通信加密
网站存储的敏感数据要加密
使用验证码防止机器人攻击
对于XSS攻击, SQL注入进行编码转换
对垃圾信息和敏感信息进行过滤
对交易转账等重要操作进行风险控制
### 2.2 架构模式在新浪微博中的应用
小结: 好的设计绝不是模范, 不是生搬硬套某个模式, 而是对问题深刻理解之上的创造和创新
山寨和创新的最大区别不是是否抄袭和模范, 而在于对问题和需求是否真正理解和把握
## 第三章: 大型网站核心架构要素
软件架构: 有关软件整体结构与组件的抽象描述, 用于指导大型软件系统各个方面的设计
系统的各个重要组成部分及其关系构成了系统的架构. 这些组成部分可以是具体的功能模块, 也可以是非功能的设计和决策, 如性能/可用性/伸缩性/扩展性/安全性, 它们相互关系组成一个整体, 共同构成了软件系统的架构
### 3.1 性能
衡量性能的指标: 响应时间, TPS, 系统性能计数器
对于网站而言, 性能符合预期仅仅是必要条件, 因为无法预知网站可能面临的访问压力, 所以必须考察系统在高并发情况下, 超出负载设计能力时可能出现的问题. 网站需要长时间运行, 还必须保证在持续运行且访问压力不均匀时保持问题的性能特征.
### 3.2 可用性
高可用的目标就是当服务器宕机时, 服务依然可用. 主要手段是集群, 冗余. 关键在于服务器中不能保存用户会话状态.
### 3.3 伸缩性
定义: 通过不断想服务器集群中添加服务器的手段来缓解不断上涨的用户并发访问压力和不断增长的数据存储需求
### 3.4 扩展性
扩展性直接关注网站的功能需求.
目的: 在网站快速发展, 功能不断扩展时, 网站架构能够快速响应需求变化.
主要手段:
a. 事件驱动架构: 利用消息队列实现
b. 分布式服务: 将业务和可复用服务分离开来, 通过分布式服务框架调用
### 3.5 安全性
小结:
## 第二篇: 架构
## 第四章: 瞬时响应, 网站的高性能架构
### 4.1 网站性能测试
不同视角下的网站性能
性能测试指标
性能测试方法
性能优化策略
### 4.2 Web前端性能优化
浏览器访问优化
CDN加速
反向代理
### 4.3 应用服务器性能优化
分布式缓存
异步操作
使用集群
代码优化
### 4.5 存储性能优化
机械硬盘 vs. 固态硬盘
B+树 vs. LSM树
RAID vs. HDFS
小结:
- 职业生涯
- 如何提升你的能力?给年轻程序员的几条建议
- 那些年,那些事
- 阿里巴巴离职DBA 35岁总结的职业生涯
- 人生的四种选择
- 程序人生的四个象限和两条主线
- 几缕代码与闲思
- 张小龙-学习笔记
- Web前端
- 移动Web手册
- 精通CSS: 高级Web标准解决方案
- 悟透JavaScript
- 架构设计
- 大型网站技术架构
- 周爱民-大道至简
- RESTful Web Services Cookbook - 读书笔记
- 大话设计模式
- Unix编程艺术
- 把程序员修炼之道读薄
- 学习能力
- 奇特的一生:读书笔记
- zhh-看源码那些事
- 一个创业者怎么看待读书和写作
- 程序员修炼之道
- 2015/1/5 头脑风暴
- 书单计划
- 2014年我读过的那些书
- 我的后端开发书架2015
- 别人的书单
- 读书笔记
- 浪潮之巅
- 达内时期自己笔记整理
- Effective Java
- 打造facebook: 读书笔记
- 面试整理
- 阿里面试的一点感受
- 腾讯的三轮面试
- 三十之惑–面霸
- 前端面试问题汇总
- 八爪网络面试总结
- 2015面试总结总结
- 找工作流程梳理
- 最全前端面试问题及答案总结
- 前端开发面试题收集
- 百度web前端--2015一面
- 百度web前端--2015二面