你好,我是好刚,在上一节介绍了网站架构的演化,了解网站从初始的小型网站开始,随着业务发展而不断迭代,最终发展成技术成熟,规模复杂的大型网站的演化过程。这一节继续介绍大型网站技术架构的第二章:网站架构的模式。
大型网站在解决高并发,海量数据和高可靠运行等问题时,提出了很多解决方法,这些方法在重复使用和验证后,最终形成了很多针对特定问题的解决方案,这就是网站架构模式。所谓模式,描述了重复发生的问题及该问题的解决方案。
学习架构模式就是了解这些技术问题并且掌握问题的解决思路,进而指导我们自己的架构设计。
在网站发展到一定阶段,网站功能日益复杂,内部代码依赖严重,会导致开发维护困难。同时因为用户量庞大,在访问高峰期,网站内部模块会有很多性能瓶颈。为了有一个清晰的逻辑结构便于开发维护,支持高并发访问,并且向分布式方向发展就需要对网站进行拆分。拆分分为两种,分层和分割。
1. 分层
第一个模式是分层,将网站系统横向维度切分,通过上层对下层的调用构成一个完整的系统。大型网站一般分为应用层,服务层,数据层。应用层负责具体业务逻辑处理和视图展示,服务层为应用层提供支持,数据层为服务层提供数据存储,通过各层依赖调用处理用户请求。
分层的优点是,庞大的系统拆分成不同模块,由不同团队负责,加快开发速度和质量;层次相对独立,只要接口不变就可以根据业务情况独立演化发展。
分层的挑战有,层次划分时需要合理规划层次边界和接口;开发中需要严格遵循分层依赖关系,通过上层调用下层,禁止跨层和逆向调用。
分层架构是逻辑上的拆分,各层可以部署在一台机器上,也可以随着网站发展,访问量增大时,分别部署到不同服务器上,提供更大的并发支持。
2. 分割
第二个模式是分割,纵向对网站进行切分,网站变大后,业务功能和服务种类变多,可以按功能或业务单元对网站业务进行分割,常见的例如:首页,列表页,详情页,由专门团队负责开发维护,代码部署在不同服务器上。分割后,每一个模块的业务复杂度减小,有助于软件开发和维护;不同模块分布式部署,可以使用更多服务器资源,提高网站并发处理能力。
分层和分割将网站系统拆分成不同模块,并且部署在不同机器上后,这就是分布式。
3. 分布式
分布式可以使用更多的计算机资源完成同一个功能,承载更大的并发访问量和数据量。
常见分布式方案:
-
分布式应用和服务,将应用和服务拆分成独立模块,分布式部署,改善网站性能;模块由专门人员分工开发,加快网站开发速度;不同应用可以复用共同服务,方便业务扩展。
-
分布式静态资源,将网站静态资源JS, CSS 独立部署,这样动静分离,减轻应用服务器负载压力;另外是使用独立缓存域名,针对静态资源配置更长的缓存过期时间,加快访问速度。
-
分布式数据库,网站数据量达到单机存储极限时,需要将数据分布式存储;另外就是使用NoSQL,现在大部分NoSQL 存储系统具备分布式部署能力。
-
分布式计算,如搜索引擎的索引构建,大数据分析,因为数据量巨大难以移动,所以主流的Hadoop 是将计算程序发送到数据所在位置进行分布式计算。
分布式也存在很多挑战有:
-
分布式服务通过网络调用,会带来性能损耗;
-
服务器规模大,宕机事件频发的同时要保证系统可用
-
分布式事务实现困难,数据一致性难以有效保障;
-
模块逐渐增多,相互调用会使依赖关系错综复杂,导致开发维护困难。
网站业务分布式部署后,网站整体性能得到提升,但是对于用户热点访问的模块,由于单机性能有限,也可能成为瓶颈,这时可以使用集群。
4. 集群
使用多台机器部署相同应用构成集群,用户请求通过负载均衡机制转发给集群内机器处理。
集群化的优点有:
-
使系统具有伸缩性,在提升业务并发访问能力的同时,当有更多访问时,只需要添加机器就可以持续提高服务能力。
-
另外就是可用性,当机器发生故障,因为集群内有多台机器提供相同服务,负载均衡设备就可以通过失效转移机制摘掉故障机器,不影响用户正常使用,提高系统的可用性。
继续介绍第5个架构模式:缓存。
5. 缓存
缓存是将数据放在距离使用最近的位置,以加快访问速度;同时因为缓存的数据不需要后端重新计算,也减轻后端应用和数据库访问压力。
大型网站常用的缓存设计有:
-
首先是网络访问层的CDN 缓存,将数据放在网络服务商的节点上,用户请求到达网络服务商时直接返回;
-
反向代理缓存,反向代理部署在网站架构的前端,负责转发请求给后端机器,如果请求命中缓存,数据直接返回给用户,加快响应的同时减轻后端机器的访问压力;
-
本地缓存,应用服务器本地内存中的缓存,特点是访问速度快,但是受限于机器内存大小;
-
分布式缓存,部署在专用的大内存服务器上,通过网络调用访问。缓存服务器组成缓存集群时,内存也将不再受限于单台机器。
但是使用缓存时对数据也有要求:
1,数据访问需要具有不均衡,一般只缓存热点数据;
2,数据要有一定有效期,过期时间不能太短,不然刚缓存的数据容易失效,产生脏数据。
6. 异步
第6个模式是异步,异步是指业务之间不同步调用,而是通过传递数据异步执行来进行协作。
数据传递使用消息队列实现,处在业务前端的程序将数据写入队列,后序程序从队列取出数据继续进行业务逻辑处理。
这种异步调用的方式,使系统具有很多特性:
-
首先异步调用降低软件耦合度,只要共享数据的结构不变,彼此功能可以独立发展,方便网站扩展。
-
提高系统可用性,后序消费进程出现故障时,业务生产者可以正常写入数据,对用户来说系统还是正常的,故障恢复后继续处理数据即可。
-
加快网站响应速度,业务前端的程序将数据写入队列就可以返回,减少响应延迟,然后由后端程序处理复杂逻辑。
-
消除并发访问高峰,促销和出现热点事件时,访问量突然增大,会导致服务器负载过高,影响网站性能,甚至宕机。使用异步模式,将访问请求放入队列,再由消费进程依次处理,对网站的压力就会变得平缓,减轻高并发访问冲击。
7. 冗余
我是好刚,我们继续介绍第7个架构模式:冗余。网站需要7*24 小时不间断运行,在服务器数量比较多时,机器故障成为必然事件。冗余模式是通过部署冗余机器和数据冗余备份,当一台服务器故障时,将其上的服务和数据转移到其他机器上继续提供服务,保证网站正常可用。
冗余的方案有:
-
服务通过集群化部署,使用多台机器提供相同服务;
-
数据库可以定期冷备归档数据,并且进行主从分离,实时同步实现热备。
-
而为了抵御地震海啸等不可抗力,可以对整个机房的服务和数据进行异地多中心备份。
8. 自动化
第八个模式是自动化,最理想的自动化是在无人值守的情况下,一切都可以自动化完成,现在网站自动化主要体现在发布与运维方面。
代码发布过程中,如果手动操作,很难避免误操作导致的故障,发布过程自动化通过减少人为干预来减少发布故障。自动化发布包含的环节有:自动化测试,将代码提交测试环境,执行测试用例,并且生成测试报告;然后自动安全检测,执行代码安全扫描,部署到安全测试环境进行安全攻击测试;最后进行自动化部署,将代码部署到生产环境。
另外就是代码运行期间,也就是线上运维过程中,可能出现各种线上故障:服务器宕机,程序出现bug,存储不足,访问流量高峰等。运维需要做线上环境监控,监控服务器及应用程序各项性能指标。当指标超出设定阈值时自动报警;检测到故障时自动进行失效转移,隔离故障点;网站遇到流量高峰时,为保障整个网站的可用性,进行自动降级,关闭不太重要的服务;针对资源不足,必要时自动扩容,分配资源增加服务器数量,保证系统可用性。
9. 安全
第九个模式是安全,在互联网上,一个网站任何人都可以访问,这使网站面临巨大的安全挑战。
在安全架构方面,现在也有很多常用手段:
-
使用手机或图片验证码验证用户身份,防止机器人攻击网站
-
登录和交易操作时要对网络进行加密,防止网络被监听导致账户和交易信息泄露
-
用户输入的数据要做XSS和SQL 注入过滤
-
存储用户信息等敏感数据时,加密存储以防止明文被泄露,互联网已经爆出多起数据库文件泄露,导致账户密码以明文流出的事件,而这些流出的账户密码,又被拿来恶意地到其他网站撞库,影响极大。
对于安全,因为攻击手段不断更新,并且网站使用的技术也可能被发现存在安全问题,我们作为开发者要时刻关注安全信息,及时跟进解决,避免安全损失。
10. 小结
最后我们小结一下,本节介绍了网站架构的九种模式,分层,分割,分布式,集群,缓存,异步,冗余,自动化和安全。
这里架构模式描述了一个技术问题,以及解决该问题的方案。在具体应用时,相比解决方案我们更应该关注问题本身,只有深刻理解问题场景,系统限制和业务逻辑,才能灵活运用前人总结的方案,快速解决实际问题,提升我们的架构设计水平。相反,如果还没有搞清楚问题,就不恰当地生搬硬套方案,很可能解决不了老问题,还会带来更加棘手的新问题。
大型网站技术架构的第二章:网站架构的九种模式就先介绍到这里。对一个网站架构,你可能还想知道怎样评价设计得不好不好,下一节网站架构的5个要素,将为你提供一些思路。我是好刚,欢迎大家关注我的微信公众号:好刚编程,观看下一期的内容。
参考资料
-
《大型网站技术架构:核心原理与案例分析》 李智慧
