• 常见的API性能优化手段有哪些?
  • 发布于 2个月前
  • 162 热度
    0 评论
最近在优化公司API接口,其中,接口性能优化是最主要的。在这个过程中,总结了关于接口优化的一些常用手段(部分手段未亲自实践),如下:

一. 缓存优化
1. 确定缓存场景
分析那些频繁被查询,且查询结果不经常变化的数据,这些数据适合被缓存,如热点商品,分类数据等。

2. 选择合适的缓存工具
根据项目需要,选择如Redis、Memcached等不同的缓存系统。

3. 缓存Key的设计
Key要唯一性、一致性良好,可以使用类似"category_" + categoryId的方式。

4. 缓存有效期
根据数据变化频率,设置不同的过期时间,不易变化的数据可以设置更长的过期时间。

5. 读取缓存逻辑

先读缓存,缓存没有再查数据库,并更新缓存。可以使用Cache Aside模式。


6. 写入缓存逻辑
更新数据库后,同步删除或更新缓存,保证数据一致性。

7. 缓存预热
启动时,可以提前将热点数据加载入缓存,减少首次访问数据库的压力。

8. 不同缓存划分数据
根据访问频率等因素,将数据区分到不同的缓存中,如热点商品放到Redis中,不频繁变动的数据放到Ehcache中等。

9. 监控缓存性能,如命中率、读写速度等,进行持续优化

总之,合理利用缓存可以显著优化系统性能,但也需要智能使用,因为缓存也带来维护的复杂度。


二. 集群和分库分表
使用集群提高系统的并发处理能力,使用分库分表来分散数据库压力。进行集群和分库分表的具体步骤可以如下:

1. 集群:
- 使用负载均衡将请求分发到多台服务器
- 配置主从复制或主主复制提高服务可用性

- 调整集群规模,增减机器来应对访问量变化


2. 分库分表:
- 根据业务特点选择拆分字段,如地区、时间等
- 拆分策略要平衡,避免数据倾斜
- 增加主键来避免跨分片查询
- 增加路由机制,根据拆分字段路由到正确数据库和表
- 预分片,允许新增分片
- 业务代码中处理分库分表逻辑
- 使用ORM框架简化分片逻辑
- 主从同步保证数据一致性
- 监控数据分布情况

3. 典型架构:
- 数据库集群+读写分离中间件
- 分表+数据库集群
- 水平拆分+垂直拆分4. 测试验证:
- 线下压力测试验证效果 
- 逐步上线观察各项指标
- 继续优化

做好集群分库分表后,需要继续监控和优化,以应对更大访问量。

三. 异步处理
将耗时操作改为异步处理,避免阻塞接口响应。可以使用消息队列或者创建异步线程来实现。

四. 请求合并
合并重复请求调用,避免重复计算和重复查询数据库。

1. 客户端合并
客户端在发起请求前,对重复的请求进行合并,只发送一次,然后对结果进行拆分。

2. 服务端合并
服务器端利用缓存或内存队列。将固定时间内的重复请求合并为一次查询数据库,然后将结果复制给每个请求。

3. 分布式缓存合并
使用Redis等分布式缓存。对相同key值的请求,一定时间内仅查询一次数据库,后续直接从缓存返回。

4. RPC合并
某些RPC框架如Dubbo支持请求合并。客户端将小的重复请求合并为一个大请求,服务端再拆分返回结果。

5. 消息队列合并
客户端先发送消息到MQ,然后worker从MQ中取出消息并合并后处理。

6. 数据库端合并
数据库增加存储过程,实现一定时间内的重复查询请求合并,返回统一结果。

7. Load Balancer合并
LB对特定请求进行识别,转发到指定服务器,由其合并处理后返回。

要做到高效合并需要客户端和服务端共同配合,适当地结合以上各种方式,可以大幅减少重复请求导致的性能损失。

五. 流量控制
使用限流和熔断等方式,对流量进行控制,避免流量激增压垮系统。常见的流量控制方法有:

1. 限流

设置流量的最大阈值,超过阈值则丢弃请求或排队。常用的算法有漏桶、令牌桶等。


2. 熔断
请求失败率达到阈值时,直接快速失败,避免排队堆积。

3. 降级
在流量高峰期,提供简化的服务响应,保证核心功能可用。

4. 过载保护
限制请求接入的连接数或者请求处理的线程数,避免过载。

5. 流量整形
按照系统的处理能力,适当调整请求流入的速率,平滑流量突峰。 

6. 服务自动扩容
根据流量实时情况,自动增加服务器数量,增强处理能力。

7. 流量监控预警
监控流量及用户请求,预警示可能的流量激增情况。

8. 负载均衡
将流量分配到多台服务器处理,避免单点过载。

综合这些技术,可以根据实际业务需求,设计出合理的流量控制方案,保护系统在流量激增情况下依然保持稳定。

六. 优化数据库查询
优化慢查询,使用索引等方式提高查询效率,主要操作如下:

1. 使用索引
对查询条件的字段创建索引,可以大大提高查询速度。

2. 避免全表扫描
尽量避免顺序扫描整张表的查询方式,场景索引。

3. 数据预处理
使用物化视图、生成汇总表等方式,将重要的数据预处理后存储,减少查询计算。

4. 减少返回字段
只查询需要的字段,不要使用SELECT *。

5. 避免重复查询
使用缓存或者临时表保存结果,避免重复查询。

6. 分页查询
尽量使用分页查询,避免返回大量数据。

7. 优化关联查询
使用嵌套查询,不要关联大表查询。

8. 选择优化数据库
部分数据库针对查询做了优化,如Time scale DB。

9. 优化查询语句
精简查询逻辑,使用Explain分析执行计划。

10. 参数绑定
使用参数绑定避免字符串拼接导致无法使用索引。

11. 分库分表
使用分库分表将数据分散到多台服务器。通过数据库本身的优化,代码层优化查询逻辑,可以显著提升查询性能。

七. 结果缓存

对一些需要复杂计算的查询结果进行缓存,避免重复计算。


八. 代码优化
优化关键业务逻辑代码的效率,代码优化的常见措施包括:

1. 算法优化
使用更优的算法,例如二分查找代替线性查找。

2. 缓存优化
使用缓存机制,避免重复计算和请求。

3. 异步处理
使用多线程、协程等方式进行异步并行处理,提高效率。

4. 请求合并
合并重复的请求和数据库查询,减少计算次数。

5. 批处理
将多个小操作合并成批处理,减少交互次数。

6. 流水线设计
将运算步骤进行流水线设计,提高并发度。

7. 减少IO操作
使用高速缓存,减少文件IO。使用缓冲等技术减少网络IO开销。

8. 循环优化
减少循环层级,展开循环,减少函数调用等。

9. 避免溢出和下溢
使用更稳定的算法,避免数值溢出下溢。

10. 程序剖析
使用profiler查找热点代码,优化其效率。合理使用以上优化手段,对程序中最耗时、最频繁的部分进行优化,可以显著提升整体性能。需要针对具体场景进行测试对比,选择合适的优化方案。

九. 资源隔离
对关键服务使用独立资源,防止其他服务消耗资源影响性能。

十. 参数调优

根据实际情况调整系统参数,提高并发处理能力。


综合使用以上这些手段,可以有效优化接口性能。需要注意一点的是,要结合自己项目的实际情况,有的放失,对症下药!

用户评论