高并发高可用

高并发

一般和高性能一起讲

设计层面

  • 网关:负载均衡

  • 服务分布式化、无状态化,支持水平弹性扩容

  • 使用缓存,多级缓存

  • 调用链路热点前置(如CDN

  • 提前容量规划(如使用商品预约功能预估流量

  • 前后端限频、网关限流,阻拦不合理流量,避免不合理流量影响性能

代码层面

  • fail fast 快速失败

  • 可以做并行的地方并行化、异步化,不要用串行逻辑

  • 减小锁粒度;利用分片减小锁范围或无锁化

  • 本地缓存

  • 合并连续请求,一次性批量处理,减小网络传递流量

数据库

  • 根据不同的存储诉求来进行不同的存储选型

  • 设计合理的索引,利用覆盖索引避免回表、排序等

  • 分库分表、读写分离、数据分片

  • 热点数据拆分、隔离、分片

高可用

先明确概念:部分节点挂掉的情况下,仍能提供全部/正常服务

总体思路:1. 预防,2. 容灾(服务&存储、运维)

  • 预防

    • 代码规范

    • 单测:减少 bug,提高健壮性

    • 日志:设计良好的日志能加速发现问题

    • 做好容量规划和评估,对系统要抗住的量级有基本认知,以便设计合理的架构和演进

    • 做好压测

  • 服务与存储

    • 框架有服务治理的功能:

      • 网关:负载均衡、健康检查、故障转移

      • 阻拦不合理流量:鉴权、登录态检查、限流

      • 过载保护:熔断(保护下游)、降级(保证核心功能可用)

    • 异步解耦和削峰设计

      • 异步解耦:如果消费方异常,并不影响生产方,生产方依然可以对外提供服务。消费者恢复后可以继续从消息队列里面消费数据

      • 削峰:不会因为有突发流量而把整个系统打垮

    • 网关、服务、存储都需要多节点冗余,将单点结构转为多点结构,提高可用性

  • 存储层面

    • 集中式存储

      • DB主备、主备切换

      • 业务隔离,分库分表

    • 分布式存储

      • HDFS、HBase、ES 等

    • 缓存

      • Redis 使用哨兵或集群模式

  • 运维层面

    • 自动化CICD:自动化测试、部署;灰度发布(金丝雀发布)、蓝绿发布(新建容器发布后切换)

    • 监控与告警(prometheus + grafana),及时预警和发现故障

    • 容灾

      • 多机房部署

    • 故障演练/接口拨测

      • 接口拨测和巡检类似,每隔一个固定时间调用后端的各种接口,如果接口异常则进行告警

  • 产品层面

    • 兜底策略

      • 比如页面获取不到数据的时候,或者无法访问的时候,要如何友好的告知用户,比如【稍后重试】之类的。

      • 比如页面无法访问的时候,那么需要产品提供一个默认页面,如果后端无法获取真实数据,那么直接渲染默认页面

      • 比如服务器需要停机维护,那么产品层面给一个停机页面,所有用户只会弹出这个停机页面,不会请求后端服务

  • 应急预案

    • 出现问题后怎么快速恢复,不至于让异常事态扩大

    • 依赖的其他服务出现问题的时候,要尽快的进行降级、兜底等各种异常保护措施

参考

AllenWu - 工作十年,谈谈我的高可用架构和系统设计经验

Last updated