简单了解高并发、高性能、高可用
参考关于“高性能、高并发、高可用”的问题解决方案 - 知乎 (zhihu.com)
高并发
QPS(每秒请求数)
对共享资源并发问题的解决
高可用
系统的稳定性(避免服务宕机或者中间件宕机导致系统不可用)
高性能
接口的响应时间
系统吞吐量
TPS(每秒事务数)
高可用的系统如何在高并发的条件下实现高性能?
1.缓存
什么是缓存?
缓存是一种用空间换时间的思想,由于计算机访问数据有局部性,数据被分为两部分,一部分我们称作热点数据、另一部分我们称作冷数据
我们根据需要一般会将热点数据存放在缓存中,减少对数据库的访问,访问内存是比访问磁盘快的
我们常见的缓存,比如redis这类的非关系数据库,CPU的多级缓存,数据库日志的buffer等
缓存分类
本地缓存
我们在单机进程中对数据缓存,适合简单的场景,不需要考虑数据一致性、过期时间、删除策略等问题
分布式缓存
分布式架构下,不同服务器进程代表一个数据分片,对于热点数据的存储我们根据一致性hash算法分配到不同的分片
适合缓存的场景
- 读多写少
- 计算量耗时大,实时性低(不需要经常更新)
不适合缓存的场景
- 写多读少
- 没有热点数据
- 对数据一致性严格
缓存更新策略
2.预先延后
预先处理
我们可以先对系统进行预热,对一些热点数据存放的缓存中
延后处理
把某些耗时长的操作后放,比如通过MQ的异步处理数据库操作(减小TPS)、COW(写时复制)
3.池化
内存、连接、线程这些都是资源,创建线程、分配内存、数据库连接这些操作都有一个特征(频繁创建销毁过程带来的系统调用以及网络I/O),我们运用各种池来避免资源的频繁创建、销毁
连接池
常见的比如数据库连接池、HTTP请求连接池等
线程池
- 管理器(Manager): 用于创建并管理线程池。
- 工作线程(Worker): 执行任务的线程。
- 任务接口(Task): 每个具体的任务必须实现任务接口,工作线程将调用该接口来完成具体的任务。
- 任务队列(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.序列化与反序列化
将数据转化为二进制,减少文本大小,利于数据在网络中传输