第二章:大型网站架构模式
2.1网站架构模式
为了解决大型网站的高并发,海量数据处理,高可靠运行等一系列问题与挑战,大型互联网公司在实践中提出许多解决方案,以实现网站的高性能,高可用,易伸缩,可扩展安全等各种技术架构目标,这些解决方案又被更多网站重复利用,从而逐渐形成网站技术架构模式。
2.1.1分层
网站分层结构:
应用层:负责具体业务和视图展示,如网站首页及搜索输入和结果展示
服务层:为应用层提供服务支持,如用户管理服务,购物车服务等
数据层:提供数据访问存储服务,如数据库,缓存,文件,搜索引擎等
2.1.2分割
分层结构是软件横向切分,那么分割就是对软件的纵向划分。
就是随着网站越来越大,功能越来越复杂,服务和数据处理的种类也越多,将这些不同的功能和服务分割开来,包装成高内聚低耦合的模块单元,一方面有助于软件的开发和维护,另一方面。便于不同模块的分布式部署,提高网站的并发处理能力和功能扩展能力。
2.1.3分布式
常见:分布式应用和服务;分布式静态资源;分布式数据和存储;分布式计算
此外,分布式配置;分布式锁;分布式文件系统
2.1.4集群
多台服务器部署相同应用,构成一个集群,通过负载均衡设备共同对外提供服务
2.1.5缓存
CDN;反向代理;本地缓存;分布式缓存
2.1.6异步
提高系统可用性;加快网站相应速度;消除并发访问高峰
2.1.7冗余
必要的数据备份,热备份,冷备份,容灾数据中心
2.1.8自动化
发布过程自动化;自动化代码管理;自动化测试;自动化安全检测;自动化部署;自动化监控;自动化报警;自动化失效转移;自动化失效恢复;自动化降级;自动化分配资源
2.1.9安全
身份验证;通信加密;防止XSS攻击,SQL注入进行编码转换。
2.2架构模式在新浪微博应用
第三章大型网站核心架构要素
3.1性能
性能是网站架构设计的一个重要方面。任何软件架构设计方案都必须考虑可能会带来的性能问题。
衡量网站性能有一系列指标,重要的有响应时间,TPS,系统性能计数器等
3.2可用性
通过冗余手段,应用部署在多态服务器上同时访问,数据存储在多态服务器上面,任何一台服务器宕机,只需把请求切换到其他服务器上即可,但有一个前提是应用服务器上不能保存请求的会话信息,否则服务器宕机,会话信息丢失,即使请求切换到其他服务器,也同样不能完成任务。
3.3伸缩性
伸缩性是指通过不断想集群添加数据库的手段来缓解不断上升的用户并发访问压力和不断增长的数据存储需求
3.4扩展性
添加新业务时,不需要任何改动或者很少改动既有的服务,就可以上新服务。
网站可伸缩性架构的主要手段
事件驱动架构:生产消息和消费消息通过消息队列分开处理。
分布式服务:将业务和可复用服务分开
3.5安全性
第四章瞬时响应:网站的高性能架构
4.1网站性能测试
4.1.1不同人员网站不同性能
4.1.2性能测试指标
1.响应时间:指应用执行一个操作需要的时间,包括请求开始到收到数据返回所需要的时间
2.并发数:指系统能够同时处理的请求数目,也反应了系统的负载特性。
3.吞吐量:单位时间内系统处理请求的数目,体现系统的整体处理能力。TPS(每秒事务数)是吞吐量的一个常用量化标准,此外HSP(每秒http请求数)QPS(每秒查询数)
4.性能计数器:描述服务器或操作系统性能的一些数据指标,包括System Load(系统负载),对象与线程数,内存使用CPU使用,磁盘与网络IO等指标。
4.1.3性能测试方法
性能测试,负载测试,压力测试,稳定性测试
4.1.5性能优化策略
1.性能分析:请求发生到处理完成之间的各个环节,检查日志,分析哪个环节响应时间不合理。
2.性能优化:Web前端性能优化,应用服务器性能优化,存储服务器性能优化。
4.2Web前端性能优化
4.2.1浏览器访问优化
1.减少http请求:合并CSS,合并JavaScript,合并图片。
2.使用浏览器缓存
3.启动压缩:在服务端对文件压缩,在浏览器端对文件解压。
4.CSS放在页面最上面,JavaScript放在页面最下面
5.减少Cookie传输
4.2.2CDN加速
CDN(Content Distribute Network,内容分发网络)的本质仍然是一个缓存,将数据缓存在离用户最近的地方。
4.2.3反向代理
静态内容可以被缓存在反向代理服务器上,当其他用户啊访问同样的静态资源可以直接从反向代理服务器返回给用户。有些网站还会把动态内容页缓存在代理 服务器上,比如热点词条,帖子,博客缓存,当这些动态内容失效以后,通过内部通知机制通知反向代理缓存失效反向代理会重新加载最新的动态内容再次缓 存起来。
4.3应用服务器性能优化
4.3.1分布式缓存
网站性能优化第一定律:优先考虑使用缓存优化性能
1.缓存的基本原理:缓存是指将数据存储在相对较高访问速度的存储介质上,以供系统处理。缓存既可以减少数据访问时间,在需要计算的数据时还可以减少重复计算。
2.合理使用缓存
频繁修改的数据:数据写入缓存,应用还没来得及读取缓存数据就已经失效,数据读写比2:1,就是数据存入缓存在修改数据前至少可以被读取2次才有意义存入缓存,但是实践中其实更高,比如微博缓存一次可能会获得 成千上万的读取。
没有热点的访问:不能将所有数据都存入缓存。
数据不一致与脏读:缓存有失效时间,需要从数据库读取新数据。
缓存可用性:数据库可能已经习惯有缓存的存在 ,缓存崩溃导致数据库不能承受压力而宕机,导致网站不可用,这就叫雪崩, 分布式缓存可以一定程度改善缓存可用性
缓存预热
缓存穿透:因为不恰当的业务或者恶意攻击持续高并发请求某个不存在的数据,由于缓存没有存储所以请求都会压在数据上,会对数据库造成很大压力甚至崩溃,一个简单的措施就是将不存在的数据也缓存起来(value值为null)
3.分布式缓存架构
JBoss Cache的需要同步的分布式缓存,即所有缓存服务器都存相同的数据,当某台服务器有缓存数据更新时候,会通知其他缓存进行更新或清除数据。适合企业应用不适合大型网站应用。
Memcached采用一种集中式的缓存集群管理,也被称作互不通信的分布式架构
Memcached采用TCP(UDP也支持)通信
简单的通信协议
丰富的客户端程序
高性能网络通信
高效内存管理(解决内存碎片)--固定空间分配,chunk大小相同的在一个slab中,存储时根据数据size找到大于size的最小chunk进行存储,一个chunk只能存一个数据,依然会有内存浪费。
4.3.2异步处理
使用消息队列改善网站的扩展性。消息队列起到很好的削峰作用。
同时由于异步处理,数据写入消息队列数据立马返回给用户,数据在后续业务校验和写数据库的过程中可能会出现错 误,因此使用消息队列对业务进行异步处理以后,需要适当修改业务流程进行配合,如提交订单,订单数据写入消息 队列进行异步处理,不能立即返回下单成功,需等消息队列的消费者处理完此条消息才能返回处理结果。
【任何可以做晚点的事都可以晚点再做】
4.3.3使用集群
4.3.4代码优化
1.多线程
启动线程数可参考【启动线程数=[任务执行时间/(任务执行时间-IO等待时间)]*CPU内核数】
解决线程安全主要手段:
将对象设置成无状态对象:对象不存在状态,不会造成状态不一致问题
使用局部对象:方法内创建对象
并发访问资源时候使用锁:通过对资源上锁达到并发操作在此资源变为顺序操作
2.资源复用
主要形式:单例和对象池
3.数据结构
4.垃圾回收
【下一篇续:第5-8章笔记】
关注公众号【Java成长录】下方资源获取即可集合获取带标签的《大型网站技术架构》pdf版本
长按关注,一起进步!