第一篇 架构套路总纲
一、网站架构的目标
对架构师来说,无论架构大型网站,还是网站的某个子系统,都要考虑下面几个目标:
高性能、高可用、可伸缩、可扩展、安全。
1、高性能(performance):能够对于海量并发访问快速响应
网站的性能优化,有下面常用的招
1.1、架构层面
1.1.1、缓存
浏览器缓存、CDN缓存、应用服务器缓存(本地缓存和分布式缓存)
1.1.2、异步
本地队列(LinkedBlockingQueue)、分布式队列(Kafka, RocketMQ等)
1.2、代码层面
1.2.1、使用多线程
如通过线程池,使用CUP核数*2个线程来处理异步队列
1.2.2、改善内存使用
用空间换时间:如聊天室消息容器从TreeMap改成SkipList
1.2.3、尽量避免锁
1、能不用锁的地方尽量不用锁
2、必须用锁的地方,要控制好锁粒度;同时尽量使用无锁框架,如CAS, putIfAbsent等
1.2.4、关注时间复杂度
1、选择合适的数据结构,重点关注其时间复杂度,如TreeMap vs SkipList
2、使用JDK自带的API时,要看底层的具体实现,从而明确地知道其执行的时间复杂度。
3、尽量避免非必要的循环:循环是增加时间复杂度的关键
1.3、DB层面
索引、缓存、SQL优化、NoSQL
1.3、衡量网站的性能指标
1.3.1、响应时间
接收到请求到返回结果的时间
1.3.2、TPS & QPS
每秒写入和读取的次数
1.3.3、系统性能参数
1、CUP load average(排队等待单个CUP处理的线程数,理想值1–3)
2、CUP user usage(用户占用CUP百分比,理想值为70以内)
3、内存使用情况
4、内网外网带宽
5、磁盘IOPS等
2、高可用(availability):保证服务一直是可用的
2.1、通过冗余保证系统的高可用
冗余分2类:
1、数据存储冗余
2、依赖服务冗余:避免某依赖服务挂了没有后路
2.2、服务限流、降级、熔断
1、限流:避免非预期激增流量把服务打死
限流分自动限流和人工限流2种:
1)自动限流:在Nginx配置插件,限定每秒钟最多通过多少次请求
2)人工限流配置:如聊天室消息的通知拉取频率,可根据访问量情况动态配置
2、降级:当依赖服务故障时,系统可自动或人工降级,去除对依赖服务的依赖。
3、熔断:当依赖服务故障时,系统检测失败数或失败百分比达到阈值后,自动不再调用该故障服务,称为熔断。
2.3、故障自愈
1、如健康检查,自动重启服务
2、通过监控CPU Load指标,自动降级(降低通知拉取频率,禁用日志打印等),指标正常后配置自动恢复
2.4、借助容器自动弹性扩缩容
这里分有状态服务和无状态服务。
有状态服务:如redis多租户容器云平台,通过redis operator做redis有状态服务的槽位迁移
2.5、自动化运维
如自动化发布、自动化部署、自动化摘除故障节点等
2.6、自动化测试
每次更新上线前,通过跑全量的自动化测试脚本,避免出现regression回归问题
2.7、预发布验证
发布到pre环境验证,避免线上配置和测试环境不同而导致的风险
2.8、灰度发布
通过灰度发布,避免出问题时影响面过大。
3、可伸缩(scalability):可以动态增加和减少集群节点
3.1、应用服务器
若应用服务器上不保存数据(即无状态服务),则可通过集群扩缩容节点保证可伸缩
3.2、缓存服务器
加入新的服务器节点会使原来的路由失效,虽然缓存数据可以从DB重新加载,但如果应用服务严重依赖缓存,可能会造成网站崩溃。所以要使用改进的路由算法来保证缓存数据的可访问性。例如:取模/2的算法,例如,原来有1,2,3,4服务节点,index为5的落在了5对4取模=1, 现在扩容了5,6,7,8, 扩容后index为5的落在第5个节点上,若取不到,则用8/2, 再用5对4取模,这样可以找到1节点,缺点是需要访问2次。
3)关系数据库虽然支持数据备份,主从热备份,但很难做到大规模集群的可伸缩性,因此关系型数据库的集群方案必须从数据库之外实现。例如:rongcloud的新加的ssdb集群,通过metadata服务集群,来存储ip对应的server地址,来确保原来的路由不会失效。
4)NoSQL:为海量数据而生,伸缩性天生就很好。
- 易扩展(extensible):新增功能模块,不会影响到原来的系统使用
扩展性关注:网站增加新业务时,是否可实现对现有产品无影响,即要做到不同产品之间低耦合。如chatroom和chatroomhistorymessage.
保证易扩展有2招:
1)通过消息队列实现事件驱动架构:通过消息队列,将生产者和消费者完全解耦,这样,就可以透明地增加生产者服务和消费者服务。
2)分布式服务:例如消息服务和group, groupmanager服务。新增产品如新加个单聊产品,可复用消息服务,而不会对现有服务(如消息服务,group, group manager)造成影响;而可复用服务如消息服务升级,再提供新版本的同时,仍可保留旧版本可用,这样将不会影响现有的依赖于它的服务。
- 安全(security):避免被攻击和信息泄露