挑战与架构目标
大型网站的主要挑战是:大容量(请求量大/数据量大[海量数据])、高并发(峰值并发大)、高可用(724业务不中断)、强安全*!!!
-
高可用:availability;永不停机,一直可用、可正常使用,特殊情况下部分关键功能可用、或功能的主要能力可用!站在系统角度,部分客户可用!特殊情况不可用了,要能快速恢复可用!
- 灾备、集群、分中心&分区隔离保障
- 降级、限流、熔断
- 灰度发布
-
高性能:performance;系统响应快(低时延)、吞吐量大(同等资源下支持并发请求多)
- 缓存、分布式&集群(分区/分表/分片/分库、集群&无状态)、异步
- 算法
- 可扩展
-
强安全:security;数据无泄露、隐私被保护、攻击能防住、操作有审计
- 网络安全、系统安全、应用安全
可扩展:scalability;XYZ扩展;
易伸缩:?
熔断(服务级、网关)
-
熔断指当系统中的某个服务出现异常,如调用超时或不可用时,熔断对该服务的调用、并且后续调用直接返回,待该服务恢复后再恢复调用的机制。
- 如5秒内20次调用失败即启动熔断机制
- 每隔5秒放通部分调用,如果服务恢复正常则恢复所有调用
-
熔断是系统异常情况下的一种自动保护机制,防止系统雪崩。熔断由系统实时检测,满足条件自动触发。
- 扇出:A调B、调C,B和C又调其他服务
- 雪崩:如果扇出的链路上某个微服务的调用响应时间过长或者不可用,对微服务A的调用就会占用越来越多的系统资源,进而引起系统崩溃,即所谓的“雪崩效应”。
-
主要特征:
- 框架级实现,每个微服务都需要
- 系统自动检测、自动触发执行、自动恢复
- 熔断一般是某个服务故障引起
降级
指在特殊场景下(系统资源有限、处理能力不足等),主动降低业务(页面)或服务的功能范围,对非核心关键功能停止提供,如页面的某些功能(如商品详情页的评论记录只返回10条、库存不再实时查询等)或服务的某些能力,以保证核心关键部分功能可用的策略。
降级通常由人工手动触发(配置开关支持),相应方案需要针对性设计,并通常具有代码侵入性。
-
主要特征:
- 人工触发执行与恢复
- 针对性的方案设计,代码侵入性
- 对业务由层级之分,从最外围服务开始降级
- 降级一般是从整体负荷考虑
限流
指对目标系统、服务、节点(如网关)、资源(如数据库、缓存)限制请求流量,以保护其正常可靠运行的机制。
限流通过对并发访问/请求进行限速或者一个时间窗口内的的请求进行限速来保护系统,一旦达到限制速率则可以拒绝服务(定向到错误页或告知资源没有了)、排队或等待(比如秒杀、评论、下单)、降级(返回兜底数据或默认数据,如商品详情页库存默认有货)。
一般开发高并发系统常见的限流有:限制总并发数(比如数据库连接池、线程池)、限制瞬时并发数(如nginx的limit_conn模块,用来限制瞬时并发连接数)、限制时间窗口内的平均速率(如Guava的RateLimiter、nginx的limit_req模块,限制每秒的平均速率);其他还有如限制远程接口调用速率、限制MQ的消费速率。另外还可以根据网络连接数、网络流量、CPU或内存负载等来限流。
常见限流算法:漏桶、令牌桶。
注:有些场景并不能用缓存和降级来解决,比如稀缺资源(秒杀、抢购)、写服务(如评论、下单)、频繁的复杂查询(评论的最后几页),因此需有一种手段来限制这些场景的并发/请求量,即限流。