跳至主要內容

高并发&高可用系统

知识库实战项目高可用高并发架构高可用高并发架构大约 4 分钟

架构目标:快速响应,高可用,可升缩,可扩展,安全性,敏捷开发。
架构目标

架构策略

  • 分层:分层拆分(表现层,业务层,持久层)
  • 分割:连接池分割,机房,进程(分布式)
  • 分布式:分布式架构
  • 集群: 高可用
  • 缓存: 堆内存缓存,redis 缓存,lua 缓存
  • 异步: 写异步
  • 冗余: 数据库设计,读,写
  • 安全: 数据安全(加密)、系统安全
  • 自动: 运维,扩容,缩容;
  • 敏捷: 可持续集成,交付,部署
    架构策略

解决高可用问题方案

  1. 负载均衡

    七层的负载均衡一般是:DNS 或者 nginx 负载均衡

    负载均衡算法:
    - round-robin: 轮询,默认负载均衡算法。通过配合 weight 配置可以实现基于权重的轮询 - ip_hash :根据客户 IP 进行负载均衡,即相同的 IP 将负载均衡到同一个 server。 - hash key [consistent]: 对某一个 key 进行哈希或者使用一致性哈希算法进行负载均衡。

  2. 限流

    限流算法:漏桶算法,令牌桶算法。

    常规的做法:Tomcat 限流,接口限流,redis 限流(Redis+lua),nginx 限流

  3. 降级

    降级的最终目的是保证核心服务可用,即使是有损的。

    降级也需要根据系统的吞吐量. 响应时间. 可用率等条件进行手工降级或自动降级。

  4. 隔离

    资源隔离通过隔离来减少资源竞争,保障服务间的相互不影响和可用性。

    在实际生产环境中,比较多的隔离手段有线程隔离. 进程隔离. 集群隔离. 机房隔离. 读写隔离. 快慢隔离. 动静隔离等。

  5. 超时与重试

  6. 回滚

  7. 压测与预案

    压测一般指性能压力测试,用来评估系统的稳定性和性能,通过压测数据进行系统容量评估,从而决定是否需要进行扩容或缩容。

列举一些压测方案

  • 压测接口
  • 并发量
  • 压测策略(突发. 逐步加压. 并发量)
  • 压测指标(机器负载. QPS/TPS. 响应时间[平均. 最小. 最大])

什么是高并发

高并发(High Concurrency)是互联网分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计保证系统能够同时并行处理很多请求。

高并发相关常用的一些指标

  • 响应时间(Response Time)
  • 吞吐量(Throughput) : 单位时间内处理的请求数量(并发数量)。在大多数情况系下,qps = tps = 吞吐量
  • QPS :每秒响应请求数。在互联网领域,这个指标和吞吐量区分的没有这么明显。
  • TPS :每秒事务数量, 一个接口请求从发送请求到接收到响应为止,代表一个 tps。
  • 并发用户数 :同时承载正常使用系统功能的用户数量。

如何保障系统的高并发?

  1. 服务尽量进行拆分部署(分布式:SOA,微服务); --- 业务纵向拆分,化整为零,资源拆分,横向扩展
  2. 尽量将请求拦截在系统上游(越上游越好); --- 限流,缓存
  3. 读多写少多使用缓存(缓存抗读压力); --- 读缓存,写异步
  4. 浏览器和 APP:做限速(漏桶原理) --- 限速,限流
  5. 站点层:按照 uid 做限速,做页面缓存
  6. 服务层:按照业务做写请求队列控制流量,做数据缓存 – 队列缓冲
  7. 数据层:压力就小了,无忧无虑 –-数据库优化
  8. 其他方面:结合业务做优化

具体的解决方案:缓存(应用级别缓存. http 缓存. 多级缓存),连接池,异步,扩容,队列

数据层高并发优化

  • 数据库优化:--- RT --- 吞吐量
    1. 集群(分表. 分库. 读写分离【解决读压力】)
    2. 索引
    3. 开启缓存
    4. SQL 优化
    5. 冗余设计
    6. 防止写复杂 SQL
    7. 冷热数据分离
  • 分布式文件系统:
    1. 开源文件系统 FastDFS
    2. 云服务
      日志数据/搜索数据/简单业务数据
      elasticSearch / Redis 缓存

应用层高并发优化

  1. web 服务器优化 (线程池,连接队列)
  2. JVM 优化
  3. 代码结构优化(code review)
  4. 分布式拆分(提高吞吐量,提高集群部署网络数量)
  5. 异步架构
  6. 异步并发编程
  7. 队列 :缓冲队列,让你无队列,消息队列
  8. 线程池
  9. nosql

前端高并发优化

  1. DNS 缓存
  2. CDN 缓存
  3. 浏览器缓存
  4. nginx 缓存