架构师训练营第四周学习总结
互联网系统主要面临什么样的挑战?
高并发,大流量
Google日均PV数35亿,日均IP访问数3亿。微信在线用户10亿。天猫双11一天交易额3000亿。
高并发是系统特征,不是系统目标,高并发是设计不出来的,而是跟业务相关的,跟用户数量相关的。高并发是因,高性能,高可用是果。因为系统高并发了,所以要高性能和高可用。
高可用
系统要求7X24小时不间断服务。大型互联网站宕机会成为新闻热点。传统网站有维护,升级的时间,而互联网必须不间断服务,即使服务器故障,也不能停服。
海量数据
需要存储,管理海量数据。比如:facebook每周上传照片近10亿,百度收录网页数量过百亿。
用户分布广泛,网络情况复杂
许多大型互联网都是为全球用户服务的,用户分布范围广,各地网络情况千差万别,网络故障也层出不穷。
安全环境恶劣
互联网的开放性,使得互联网站更容易遭到攻击。
需求快速变更,发布频繁
互联网为了快速适应市场环境需求,发布频率极高。传统行业要做好多年,发版周期也长。
渐进式发展
不同于传统软件系统,一开始就规划号全部功能和非功能需求。几乎所有大型互联网网站都是从一个小网站开始,渐进发展起来的。
应对高并发挑战的两个技术方向
垂直伸缩
传统行业的思路:小型机->中型机->大型机(不断升级硬件)
互联网不能采用这种思路。主要是没钱,还有一个原因是:计算能力和成本不是线性关系,另外垂直伸缩有物理极限。
水平伸缩
指通过加机器的方式提升计算能力的一种架构方法,理论上伸缩可以是无限的。Google大概是200w台左右的机器。
可以看出来,垂直伸缩在早期其实是有优势的。比如:数据库扛不住,花钱买个好一点的数据库(SSD配置的)行不行?
互联网架构演化
第零阶段
应用程序访问本地数据库和本地文件
第一阶段
应用和数据分离
第二阶段
互联网基本都是读多写少的场景,绝大多数都是读操作。那就使用缓存改善系统。
第三阶段
一台机器资源有限,线程数有限,那就加机器,使用应用服务器集群改善系统并发性能。当前这个架构已经能满足很多业务场景了。
第四阶段
还是有很多请求到数据库上面。数据库读写分离。(应用程序是CPU密集型,数据库是磁盘密集型,缓存是内存密集型)
第五阶段
使用反向代理和CDN加速网站响应。比如在不同地域,不同网络运营商(电信,移动)都就近部署CDN服务。CDN本质是一个缓存服务,缓存图片,JS等。CDN的资源毕竟还是有限的,CDN没有的资源还是需要通过反向代理服务器回源到应用的服务器。
第六阶段
使用分布式系统和分布式数据库系统
第七阶段
使用NoSQL(不需要事务性)和搜索引擎(商品搜索,数据库的like搜索性能低,数据库资源比较宝贵)
第八阶段
业务拆分,业务继续做大,把不同的业务功能模块拆出不同的子系统部署在不同的集群,由不同的团队维护,职责单一。
第九阶段
微服务及中台化。登录,订单,商品都是可复用的服务,由中台统一来管理,新业务接入更加迅速,不用从零开始。
第十阶段
大数据与智能化。典型的像今日头条那种。
架构模式
每一个模式描述了一个我们身边不断重复发生的问题以及相应的解决方案。
分层
分层是企业应用系统中最常见的架构模式,将系统在横向维度上切分成几个部分,每个部分负责一部分相对比较单一的职责,然后通过上层对下层依赖和调用组成一个完整的系统。(比如分为:网关层,微服务层,基础设施层)
分割
如果说分层是软件在横向方面的切分,那分割就是在纵向方面对软件进行拆分。将这些不同功能和服务分割出来,包装成高内聚低耦合,相对独立的模块单元,更有利于维护和部署,以及扩展。
分布式
大型网站,分层和分割的主要目的就是为了切分后的模块便于分布式部署,部署在不同的服务器上,通过远程调用和消息队列进行通信。
集群
虽然分布式已经将切分后的模块独立部署,但是单台集群依然无法满足业务高并发要求,于是需要做集群,通过负载均衡器共同对外提供服务。
缓存
缓存就是将数据存放在距离计算最近的位置来加快处理速度,是改善性能的第一手段。比如:CDN,反向代理,本地缓存,远程缓存。
异步
计算机软件发展一个重要的目标和驱动力就是降低软件耦合性。事物直接越少直接关系,那么就越少被彼此影响,越可以独立发展。可以提高系统可用性,加快网站响应速度,消除并发访问高峰。主要是通过消息队列。
冗余
服务器是彼此可替代,一方面可以提高处理能力,另一方面是可以提高可用性。
自动化
无人值守的网站可以正常运行,几万台机器自动化管理。
安全
通过密码,手机验证码进行身份认证;登录,交易操作全程加密;对敏感数据进行加密和脱敏;防XSS和SQL注入等等。
评论