关于优化接口或程序响应的总结

之前写过接口优化相关的文章,比较粗略。最近空余时间比较多,看到网上许多关于这方面的文章,于是想着结合自己的开发经验,相对完整总结一下,也算是对以前文章的补充。

背景

辗转几家公司,就自身开发经验而言,相当多的一部分开发需求是做优化,这部分包括但不限于降低代码的复杂度,优化页面加载,优化数据库查询速度等等。

作为开发者,拿到类似的需求,如果需求很明确,比如说给你一条sql说这个sql有问题,让你去优化。那你可能就直接explain去查看sql执行情况,看看是不是索引不对,然后优化。这样的一般比较有针对性。

但是,我们通常遇到的情况是:部门接到一个报事,说某个业务或者用户在使用过程,某一个页面无法加载,或者加载实在太久,有时甚至导致响应超时这样的问题。这个时候需要处理这个问题,相对而言这样子的需求就显得不那么明确。

写这篇文章的目的就是想着,针对这样的需求。从前端页面开始,到负载均衡,到后端服务,到最后访问数据库,沿着这个流程,从头到尾,结合自身经验对每一个环节进行可能的优化。

具体优化思路

1.前端页面优化

  • 有些静态数据并不需要调用接口去查询,比如京东首页的轮播图,这些可以单独存储在本地,然后通过一些策略更新它。
  • 接口的调用遵循最小化原则,仅仅请求必要的数据,请求体或者响应体尽量小,摒弃不要的内容。
  • 前端页面的渲染尽量采用异步渲染,比如使用vue的异步组件。
  • 多个接口的调用,可以考虑使用异步并发,而不是串行。曾遇到过类似的需求,一个页面同时调用了10个后端接口,如果同时10个用户访问这个页面,那么并发就是100,自然会拖慢响应速度,后续的处理办法是接口合并,后端该异步异步,不在前端处理。
  • 利用HTTP缓存策略避免重复请求。
  • 针对远程调用场景,可以通过CDN(Content Delivery Network)来分发静态资源,部署负载均衡器,使用户就近访问服务节点,从而减少网络传输延迟。

2.后端服务优化

  • 批处理。简单讲就是将多个请求合并为一个请求,减少请求次数。不单单指数据库请求,也包括调用远程接口等。
  • 异步。与主流程不是强关联的部分,可以异步处理。比如下单成功,账户需要增加积分,这可以交给mq去异步处理。当然异步处理也可以使用线程或者别的异步框架实现。
  • 缓存。这部分很好理解,对于不经常变更的数据,可以缓存起来,减少数据库查询次数。当然,避免缓存穿透击穿和雪崩等等问题,同时得考虑数据一致性问题。
  • 前置计算。之前遇到需求是从小时,天,周,以及月维度统计部门扫地机器的工作时间。而对于机器而言,每分钟都进行当前工作状态的数据上报,数据量相对较多,如果进行实时统计,计算的时间比较长,于是拖慢了数据加载速度。最终实现方案是新建一张表,每天定时计算前一天的机器工作数据,对于当天的查询去实时计算,对于之前的数据直接才从新表中获取。
  • 池化思想。线程池,数据库连接池等
  • 优化代码结构。串行改并行
  • 优化事务处理,创建最小的事务管理单元,减少事务的粒度,减少事务的提交次数。
  • 明确领域边界,避免跨库操作。
  • 锁的优化,避免死锁,同时避免太粗粒度的锁。

3.数据库优化(mysql为例)

  • 索引优化。是不是索引失效了?尝试建立新的合适的索引,避免回表等。
  • 避免子查询,小表驱动大表等。
  • 优化处理深度分页问题。

后记

可能总的来说还是不够全面,我也会在以后对相应的优化问题做补充。

补充以前写的文章的链接:https://juejin.cn/post/7110838544582574117

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值