一般和高性能一起讲
- 网关:负载均衡
- 服务分布式化、无状态化,支持水平弹性扩容
- 使用缓存,多级缓存
- 调用链路热点前置(如CDN
- 提前容量规划(如使用商品预约功能预估流量
- 前后端限频、网关限流,阻拦不合理流量,避免不合理流量影响性能
- fail fast 快速失败
- 可以做并行的地方并行化、异步化,不要用串行逻辑
- 减小锁粒度;利用分片减小锁范围或无锁化
- 本地缓存
- 合并连续请求,一次性批量处理,减小网络传递流量
- 根据不同的存储诉求来进行不同的存储选型
- 设计合理的索引,利用覆盖索引避免回表、排序等
- 分库分表、读写分离、数据分片
- 热点数据拆分、隔离、分片
先明确概念:部分节点挂掉的情况下,仍能提供全部/正常服务
总体思路:1. 预防,2. 容灾(服务&存储、运维)
- 预防
-
代码规范
-
单测:减少 bug,提高健壮性
-
日志:设计良好的日志能加速发现问题
-
做好容量规划和评估,对系统要抗住的量级有基本认知,以便设计合理的架构和演进
-
做好压测
-
- 服务与存储
- 框架有服务治理的功能:
- 网关:负载均衡、健康检查、故障转移
- 阻拦不合理流量:鉴权、登录态检查、限流
- 过载保护:熔断(保护下游)、降级(保证核心功能可用)
- 异步解耦和削峰设计
- 异步解耦:如果消费方异常,并不影响生产方,生产方依然可以对外提供服务。消费者恢复后可以继续从消息队列里面消费数据
- 削峰:不会因为有突发流量而把整个系统打垮
- 网关、服务、存储都需要多节点冗余,将单点结构转为多点结构,提高可用性
- 框架有服务治理的功能:
- 存储层面
- 集中式存储
- DB主备、主备切换
- 业务隔离,分库分表
- 分布式存储
- HDFS、HBase、ES 等
- 缓存
- Redis 使用哨兵或集群模式
- 集中式存储
- 运维层面
- 自动化CICD:自动化测试、部署;灰度发布(金丝雀发布)、蓝绿发布(新建容器发布后切换)
- 监控与告警(prometheus + grafana),及时预警和发现故障
- 容灾
- 多机房部署
- 故障演练/接口拨测
- 接口拨测和巡检类似,每隔一个固定时间调用后端的各种接口,如果接口异常则进行告警
- 产品层面
- 兜底策略
- 比如页面获取不到数据的时候,或者无法访问的时候,要如何友好的告知用户,比如【稍后重试】之类的。
- 比如页面无法访问的时候,那么需要产品提供一个默认页面,如果后端无法获取真实数据,那么直接渲染默认页面
- 比如服务器需要停机维护,那么产品层面给一个停机页面,所有用户只会弹出这个停机页面,不会请求后端服务
- 兜底策略
- 应急预案
- 出现问题后怎么快速恢复,不至于让异常事态扩大
- 依赖的其他服务出现问题的时候,要尽快的进行降级、兜底等各种异常保护措施