优化方案分析
对于一个系统而言,想要综合性提高并发能力,一般采取的都是下面3种方案:
- 提高单机并发:减少接口的RT(Response Time),提高单个接口的响应速度。
- 服务水平扩展(水平复制):将高频服务多部署几台,借助负载均衡提升整体性能
- 做好服务保护:并发提升的情况下,服务的高可用更要保障,做好服务熔断、降级保护措施
小提示:
比如当前系统较慢,排查的方法可以从前端-缓存-后端(业务代码/线程池/sql索引)入手。
具体的优化可以从提高单机并发/服务水平扩展入手。高并发读优化
- 增加缓存:优先查缓存,缓存也可以有多种集群架构,可用性也进一步提升
- 优化Java代码:同步查询多个接口可以变成异步(CompletableFuture接口),多线程
- for-rpc/http
- 假设有一个接口:User queryById(Long userId)
- 接口调用方:for (Long userId : userIds) {queryById(userId)}
- 解决方案:让接口提供方提供一个批量操作(CRUD)接口
- for-db
- insert:for:save
- update:for updateById
- delete: for removeById
- 解决方案:batch操作-mybatis-mp-sql
- for-rpc/http
- SQL优化:创建简单索引,涉及多字段的创建聚合索引
高并发写优化
- 优化Java代码:单线程变多线程写、批量写操作
- 同步变异步:发个MQ、或者定时任务轮询写
- 优点
- 无需等待,大大减少响应时间。
- 利用MQ存储信息,流量削峰填谷
- 降低写频率,减少数据库并发压力
- 缺点
- 依赖MQ/定时任务可靠性
- 只是降低频率,没有减少数据库写次数。
- 优点
合并写请求:所有请求,适用于新增、更新、删除逻辑
- 优点
- 写缓存速度更快,大大减少响应时间
- 真正有效降低数据库写频率和写次数,减轻数据库并发压力。
- 缺点
- 实现复杂
- 依赖缓存中间件可靠性
- 不支持事务和复杂业务
- 优点