第三章 大型网站核心架构要素
软件架构需要关注性能、可用性、伸缩性、扩展性、安全性这5个架构要素。
一、性能
任何软件架构设计方案必须考虑可能会带来的性能问题。优化网站性能的手段也很多,影响用户请求的所有环节还可以优化。
-
在浏览器端,可以通过浏览器缓存、页面压缩、合理布局页面、减少Cookie传输等手段改善性能。
-
还可以使用CDN,将网站静态内容分发至离用户最近的网络服务商机房,使用户通过最短路径获取数据。可以在网站机房部署反向代理服务器,换成热点文件。
-
在应用服务器端,可以使用服务器本地缓存和分布式缓存,通过缓存在内存中的热点数据处理用户请求。
-
也可以通过异步操作将用户请求发送至消息队列等待后续处理,而当前请求直接返回用户。
-
在多用户高并发时,使用应用服务器集群。
-
在代码层面,也可以使用多线程、改善内存管理等手段优化。
-
在数据库服务器端,有索引、缓存、SQL优化等性能优化手段。
衡量网站性能有一系列指标,最重要的是响应时间、TPS、系统性能计数器等。
二、可用性
网站总可用时间=总时间-故障时间
因为网站使用的硬件是普通的商用服务器,不保证高可用。大型网站通常有上万台服务器,每天必定会有一些服务器宕机,因此网站高可用设计架构的前提是必须会出现服务器宕机,而高可用设计目标是当服务器宕机时,服务或应用依然高可用。
高可用的主要手段是冗余,应用、数据等部署在多台服务器上,任何一台服务器宕机都不会影响应用的整体可用。
-
对于应用服务器,多台应用服务器通过负载均衡设备组成一个集群共同对外提供服务。任何一台服务器宕机,只需把请求切换到其他服务器,一个前提条件是应用服务器上不能保存请求的会话信息,否则会因为宕机导致会话丢失。
-
对于存储服务器,需要对数据进行实时备份,当服务器宕机时需将访问转移到可用的服务器上,并进行数据恢复以保证继续有服务器宕机时数据依然可用。
除了运行环境,还需要开发过程的质量保证。
三、伸缩性
伸缩性是指通过不断向集群中加入服务器的手段来缓解不断上升的用户并发访问压力和不断增长的数据缓存需求。
衡量架构伸缩性的主要标准是是否可以用多台服务器构建集群。是否容易向集群中添加新的服务器。加入新的服务器后是否可以提供和原来一样的服务。集群中可容纳的总服务器数量是否有限制。
- 对于应用服务器集群,只要服务器上不保存数据,所有服务器是对等的,可以使用负载均衡设备就可以向集群中不断加入服务器。
- 对于缓存服务器集群,加入新的服务器可能会导致缓存路由失效,导致集群中大部分缓存数据无法访问。需要改进缓存路由算法保证缓存数据可访问性。
- 对于关系数据库,很难做到大规模集群的伸缩性,可以通过路由分区等手段将部署有多个数据库的服务器组成一个集群。
四、扩展性
关注网站功能的功能性需求,如何设计网站架构使其能快速响应需求变化,是可扩展性架构主要目的。
衡量网站架构扩展性好坏主要标准是在网站增加新业务产品时,是否可以实现对现有产品透明无影响,不需要改动或很少改动既有业务功能就可以上线新产品。
主要手段是事件驱动架构和分布式服务:
- 事件驱动架构通常利用消息队列实现,将请求和其他业务事件构造成消息发布到消息队列,消费者从消息队列获取消息进行处理。
- 分布式服务是将业务和可复用服务分离,通过分布式服务框架调用。
五、安全性
保护网站不受恶意访问和攻击,保护网站的重要数据不被窃取。
衡量标准是针对现存和潜在的各种攻击手段和窃密手段,是否有可靠应对策略。