参考关于“高性能、高并发、高可用”的问题解决方案 - 知乎 (zhihu.com)

高并发

QPS(每秒请求数)

对共享资源并发问题的解决

高可用

系统的稳定性(避免服务宕机或者中间件宕机导致系统不可用)

高性能

接口的响应时间

系统吞吐量

TPS(每秒事务数)

高可用的系统如何在高并发的条件下实现高性能?

1.缓存

什么是缓存?

缓存是一种用空间换时间的思想,由于计算机访问数据有局部性,数据被分为两部分,一部分我们称作热点数据、另一部分我们称作冷数据

我们根据需要一般会将热点数据存放在缓存中,减少对数据库的访问,访问内存是比访问磁盘快的

我们常见的缓存,比如redis这类的非关系数据库,CPU的多级缓存,数据库日志的buffer等

缓存分类

  • 本地缓存

    我们在单机进程中对数据缓存,适合简单的场景,不需要考虑数据一致性、过期时间、删除策略等问题

  • 分布式缓存

    分布式架构下,不同服务器进程代表一个数据分片,对于热点数据的存储我们根据一致性hash算法分配到不同的分片

适合缓存的场景

  • 读多写少
  • 计算量耗时大,实时性低(不需要经常更新)

不适合缓存的场景

  • 写多读少
  • 没有热点数据
  • 对数据一致性严格

缓存更新策略

2.预先延后

预先处理

我们可以先对系统进行预热,对一些热点数据存放的缓存中

延后处理

把某些耗时长的操作后放,比如通过MQ的异步处理数据库操作(减小TPS)、COW(写时复制)

3.池化

内存、连接、线程这些都是资源,创建线程、分配内存、数据库连接这些操作都有一个特征(频繁创建销毁过程带来的系统调用以及网络I/O),我们运用各种池来避免资源的频繁创建、销毁

连接池

常见的比如数据库连接池、HTTP请求连接池等

线程池

  1. 管理器(Manager): 用于创建并管理线程池。
  2. 工作线程(Worker): 执行任务的线程。
  3. 任务接口(Task): 每个具体的任务必须实现任务接口,工作线程将调用该接口来完成具体的任务。
  4. 任务队列(TaskQueue): 存放还未执行的任务。

4.异步(回调)

  • 同步:串行化执行,下个任务在本任务执行后才能执行
  • 异步:下个任务和本任务可以同时执行,本任务执行完成回调给下个任务知道本任务完成,比如异步编排CompletableFuture、AIO(异步I/O)、线程异步

5.MQ

解耦、异步、削峰

好处

  • 服务解耦
  • 部分任务异步执行,提高服务的并发度

问题

  • 降低了数据一致性,从强一致性变为最终一致(弱一致性)
  • 有消息丢失的风险,比如宕机,需要有容灾机制

6.批量处理

涉及到 I/O 考虑批量处理,比如数据库的批量更新,以及redis的管道或者是lua脚本

7.数据库优化

索引

合理使用索引

读写分离

配置主从架构

分库分表

8. 零拷贝

9. 无锁化

CAS(Compare And Swap)

什么是 CAS,CAS 有三个操作数,内存里当前值 M、预期值 E、修改的新值 N

10.序列化与反序列化

将数据转化为二进制,减少文本大小,利于数据在网络中传输