一、背景
二、接口优化方案总结
1.批处理
//批量入库
batchInsert();
2.异步处理

至于异步的实现方式,可以用线程池,也可以用消息队列,还可以用一些调度任务框架。
3.空间换时间

4.预处理
5.池化思想
比如:对象池
6.串行改并行
7.索引

8.避免大事务
@Transactional(value = "taskTransactionManager", propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED, rollbackFor = {RuntimeException.class, Exception.class})
public BasicResult purchaseRequest(PurchaseRecord record) {
BasicResult result = new BasicResult();
...
pushRpc.doPush(record);
result.setInfo(ResultInfoEnum.SUCCESS);
return result;
}
所以为避免大事务问题,我们可以通过以下方案规避:
1,RPC调用不放到事务里面
2,查询操作尽量放到事务之外
3,事务中避免处理太多数据
9.优化程序结构
10.深分页问题
深分页问题比较常见,分页我们一般最先想到的就是 limit ,为什么会慢,我们可以看下这个SQL:
select * from purchase_record where productCode = 'PA9044' and status=4 and id > 100000 limit 200
11.SQL优化
sql优化能大幅提高接口的查询性能,由于本文重点讲述接口优化的方案,具体sql优化不再一一列举,小伙伴们可以结合索引、分页、等关注点考虑优化方案。
12.锁粒度避免过粗
错误的加锁方式:
//非共享资源
private void notShare(){
}
//共享资源
private void share(){
}
private int right(){
notShare();
synchronized (this) {
share();
}
}
三、最后
接口性能问题形成的原因思考
我相信很多接口的效率问题不是一朝一夕形成的,在需求迭代的过程中,为了需求快速上线,采取直接累加代码的方式去实现功能,这样会造成以上这些接口性能问题。
变换思路,更高一级思考问题,站在接口设计者的角度去开发需求,会避免很多这样的问题,也是降本增效的一种行之有效的方式。
以上,共勉!