高并发系统设计-笔记


基础

1、通用设计方法

  • Scale-out(横向扩展):分而治之是一种常见的高并发系统设计方法,采用分布式部署的方式把流量分流开,让每个服务器都承担一部分并发和流量。

  • 缓存:使用缓存来提高系统的性能,就好比用“拓宽河道”的方式抵抗高并发大流量的冲击。

  • 异步:在某些场景下,未处理完成之前,我们可以让请求先返回,在数据准备好之后再通知请求方,这样可以在单位时间内处理更多的请求。

2、架构分层

 https://yq.aliyun.com/articles/69327

高并发系统3个目标: 高性能、高可用、可扩展

3、 高性能

 从用户使用体验的角度来看,200ms 是第一个分界点:接口的响应时间在 200ms 之内,用户是感觉不到延迟的,就像是瞬时发生的一样。而 1s 是另外一个分界点:接口的响应时间在 1s 之内时,虽然用户可以感受到一些延迟,但却是可以接受的,超过 1s 之后用户就会有明显等待的感觉,等待时间越长,用户的使用体验就越差。所以,健康系统的 99 分位值的响应时间通常需要控制在 200ms 之内,而不超过 1s 的请求占比要在 99.99% 以上。

吞吐量 = 并发进程数 / 响应时间

增加系统处理核心数、减少响应时间

4、高可用

度量指标

MTBF(Mean Time Between Failure)是平均故障间隔的意思,代表两次故障的间隔时间,也就是系统正常运转的平均时间。这个时间越长,系统稳定性越高。

MTTR(Mean Time To Repair)表示故障的平均恢复时间,也可以理解为平均故障时间。这个值越小,故障对于用户的影响越小。

Availability = MTBF / (MTBF + MTTR)

一般来说,我们的核心业务系统的可用性,需要达到四个九,非核心系统的可用性最多容忍到三个九。

设计思路:

系统设计 - “Design for failure”

failover(故障转移):

1. 是在完全对等的节点之间做 failover。
2. 是在不对等的节点之间,即系统中存在主节点也存在备节点。

超时控制

99% 的响应时间

降级

保证核心服务的稳定而牺牲非核心服务的做法

限流

通过对并发的请求进行限速来保护系统

系统运维:

灰度发布、故障演练

  

5、可扩展 

拆分 (方式 水平、垂直)

存储层

业务层


 演进-数据库:

池化技术(数据库、线程池)

依据一些云厂商的 Benchmark 的结果,在 4 核 8G 的机器上运 MySQL 5.7 时,大概可以支撑 500 的 TPS 和 10000 的 QPS

主从分离

分库分表

垂直:业务

水平 :属性字段

演进-缓存:

NoSql

Redis 、 Hbase 、 mongodb

缓存策略

Cache Aside(旁路缓存)策略
Read/Write Through
Write Back(写回)策略

你需要关注缓存命中率这个指标(缓存命中率 = 命中缓存的请求数 / 总请求数)。一般来说,在你的电商系统中,核心缓存的命中率需要维持在 99% 甚至是 99.9%,哪怕下降 1%,系统都会遭受毁灭性的打击。

缓存高可用方案

客户端、中间层、服务端

常用一致性hash

 缺点

  • 缓存节点在圆环上分布不平均,会造成部分缓存节点的压力较大;当某个节点故障时,这个节点所要承担的所有访问都会被顺移到另一个节点上,会对后面这个节点造成压力。严重的会导致雪崩!!! -- 虚拟节点

  • 一致性 Hash 算法的脏数据问题。 -- 设置过期时间、减少节点个数

缓存穿透

回种空值

布隆过滤器(存在误判、不支持删除)

CDN

演进-消息队列:

解耦、异步、消峰

  

消息丢失

网络抖动处理:重发
消息队列服务器宕机:集群
消息重复:使用唯一 ID 保证消息唯一性。

kafka 生产端设置ack

演进-分布式服务:

微服务改造:

1 高内聚低耦合
2 粒度 先粗后细
3 边迭代边拆分
4 接口定义可扩展

PRC框架

1 高内聚低耦合
2 粒度 先粗后细
3 边迭代边拆分
4 接口定义可扩展

RPC框架考虑两个问题:
1 网络传输 - 多路复用
IO模型 两个阶段
请求(等待资源) 阻塞非阻塞
获取(使用资源) 同步异步

2 序列化
JSON protobuf thrift

注册中心

分布式trace

traceid spanid

负载均衡

静态: 不参考后端服务的状态 轮训、带权重轮训

动态: 参考后端服务状态 ,选择负载最小、资源最空闲的服务

网关

架构模式,将一些服务共有的功能整合在一起,独立部署为单独的一层,解决服务治理的问题

入口、出口

性能扩展性:使用多路IO复用和线程池并发处理

多机房部署:

问题 数据延迟

同城双活: 写入跨机房、读取同机房

异地多活:异步数据同步

Service Mesh

SideCar

istio 数据、控制

演进-维护:

服务端监控:

Google Four Golden Signals:

延迟 响应时间

通信 吞吐量

错误 系统错误

饱和度 资源使用 cpu 内存 io

压测

流程copy、流量染色、影子库、监控熔断

配置中心

存储:

变更通知:轮训-基于md5 长链接

高可用 : 多级缓存 内存 + 文件 降级方案

非核心系统故障- 熔断降级

断路器: 打开 半打开 关闭

降级: 

读: 降级数据、降频

写: 异步写

限流:

计数

滑动窗口

漏桶:流量整形

令牌桶:突增流量

演进-实战:


实战 

参考:

提纲

原文地址:https://www.cnblogs.com/huilei/p/11752809.html