高并发&高可用系统
大约 4 分钟
架构目标:快速响应,高可用,可升缩,可扩展,安全性,敏捷开发。
架构策略
- 分层:分层拆分(表现层,业务层,持久层)
- 分割:连接池分割,机房,进程(分布式)
- 分布式:分布式架构
- 集群: 高可用
- 缓存: 堆内存缓存,redis 缓存,lua 缓存
- 异步: 写异步
- 冗余: 数据库设计,读,写
- 安全: 数据安全(加密)、系统安全
- 自动: 运维,扩容,缩容;
- 敏捷: 可持续集成,交付,部署
解决高可用问题方案
负载均衡
七层的负载均衡一般是:DNS 或者 nginx 负载均衡
负载均衡算法:
- round-robin: 轮询,默认负载均衡算法。通过配合 weight 配置可以实现基于权重的轮询 - ip_hash :根据客户 IP 进行负载均衡,即相同的 IP 将负载均衡到同一个 server。 - hash key [consistent]: 对某一个 key 进行哈希或者使用一致性哈希算法进行负载均衡。限流
限流算法:漏桶算法,令牌桶算法。
常规的做法:Tomcat 限流,接口限流,redis 限流(Redis+lua),nginx 限流降级
降级的最终目的是保证核心服务可用,即使是有损的。
降级也需要根据系统的吞吐量. 响应时间. 可用率等条件进行手工降级或自动降级。隔离
资源隔离通过隔离来减少资源竞争,保障服务间的相互不影响和可用性。
在实际生产环境中,比较多的隔离手段有线程隔离. 进程隔离. 集群隔离. 机房隔离. 读写隔离. 快慢隔离. 动静隔离等。超时与重试
回滚
压测与预案
压测一般指性能压力测试,用来评估系统的稳定性和性能,通过压测数据进行系统容量评估,从而决定是否需要进行扩容或缩容。
列举一些压测方案
- 压测接口
- 并发量
- 压测策略(突发. 逐步加压. 并发量)
- 压测指标(机器负载. QPS/TPS. 响应时间[平均. 最小. 最大])
什么是高并发
高并发(High Concurrency)是互联网分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计保证系统能够同时并行处理很多请求。
高并发相关常用的一些指标
- 响应时间(Response Time)
- 吞吐量(Throughput) : 单位时间内处理的请求数量(并发数量)。在大多数情况系下,qps = tps = 吞吐量
- QPS :每秒响应请求数。在互联网领域,这个指标和吞吐量区分的没有这么明显。
- TPS :每秒事务数量, 一个接口请求从发送请求到接收到响应为止,代表一个 tps。
- 并发用户数 :同时承载正常使用系统功能的用户数量。
如何保障系统的高并发?
- 服务尽量进行拆分部署(分布式:SOA,微服务); --- 业务纵向拆分,化整为零,资源拆分,横向扩展
- 尽量将请求拦截在系统上游(越上游越好); --- 限流,缓存
- 读多写少多使用缓存(缓存抗读压力); --- 读缓存,写异步
- 浏览器和 APP:做限速(漏桶原理) --- 限速,限流
- 站点层:按照 uid 做限速,做页面缓存
- 服务层:按照业务做写请求队列控制流量,做数据缓存 – 队列缓冲
- 数据层:压力就小了,无忧无虑 –-数据库优化
- 其他方面:结合业务做优化
具体的解决方案:缓存(应用级别缓存. http 缓存. 多级缓存),连接池,异步,扩容,队列
数据层高并发优化
- 数据库优化:--- RT --- 吞吐量
- 集群(分表. 分库. 读写分离【解决读压力】)
- 索引
- 开启缓存
- SQL 优化
- 冗余设计
- 防止写复杂 SQL
- 冷热数据分离
- 分布式文件系统:
- 开源文件系统 FastDFS
- 云服务 日志数据/搜索数据/简单业务数据 elasticSearch / Redis 缓存
应用层高并发优化
- web 服务器优化 (线程池,连接队列)
- JVM 优化
- 代码结构优化(code review)
- 分布式拆分(提高吞吐量,提高集群部署网络数量)
- 异步架构
- 异步并发编程
- 队列 :缓冲队列,让你无队列,消息队列
- 线程池
- nosql
前端高并发优化
- DNS 缓存
- CDN 缓存
- 浏览器缓存
- nginx 缓存