聊聊接口性能优化的11个小技巧

b5f831e0c9cd37cd68a03f81e61a6304.png

若有收获,请记得分享和转发哦

前言

接口性能优化对于从事后端开发的同学来说,肯定再熟悉不过了,因为它是一个跟开发语言无关的公共问题。

该问题说简单也简单,说复杂也复杂。

有时候,只需加个索引就能解决问题。

有时候,需要做代码重构。

有时候,需要增加缓存。

有时候,需要引入一些中间件,比如mq。

有时候,需要需要分库分表。

有时候,需要拆分服务。

等等。。。

导致接口性能问题的原因千奇百怪,不同的项目不同的接口,原因可能也不一样。

本文我总结了一些行之有效的,优化接口性能的办法,给有需要的朋友一个参考。

66a18d54c5bdc25e0fe02b95116cc4fb.png

fcc5c68b020f4a22ab07dd2e2f8141da.png

800f8b50b7a6f2b78cc33cd6f11d3f61.png

f1e233c25d81bd96133557f49849b8b9.png

说实话,sql语句没有走索引,排除没有建索引之外,最大的可能性是索引失效了。

下面说说索引失效的常见原因:7b644d3d4ec37646754ac61099a0817f.png如果不是上面的这些原因,则需要再进一步排查一下其他原因。

81e87278bb2d695d294c697aa9748060.png

de876d075714fb6d46bec9f39bd2689e.png

b29a6085516e0160bf72b8086b9091b5.png

7274f71cfcb1f4856e6b2f4389069742.png

28b93bf2e983d56547b4f9e6328af9ee.png

a41c35e18a92a8eaa656e72b0d4cf85c.png

调用远程接口总耗时 200ms = 200ms(即耗时最长的那次远程接口调用)

在java8之前可以通过实现Callable接口,获取线程返回结果。

java8以后通过CompleteFuture类实现该功能。我们这里以CompleteFuture为例:

a614b535554507a8bd986fe50bc61d4d.png

94349498c79a2954b912c3b7bba3217b.png

c7e23ea82460a7f14cf5d3067a29c51d.png

37c7c2aa7f274fe176ca2dfd5551af2a.png

15433ebdd2df7b8f932967de262588a7.png

d89f3f16963419784b827898b9cb6356.png

60d6b0682409e740b91fe107e708e4e9.png

a0b4a80b2d34ae8f3e997bfc8884324f.png

5. 异步处理

有时候,我们接口性能优化,需要重新梳理一下业务逻辑,看看是否有设计上不太合理的地方。

比如有个用户请求接口中,需要做业务操作,发站内通知,和记录操作日志。为了实现起来比较方便,通常我们会将这些逻辑放在接口中同步执行,势必会对接口性能造成一定的影响。

接口内部流程图如下:feecf71141bf6929691cad67f495ac3b.png这个接口表面上看起来没有问题,但如果你仔细梳理一下业务逻辑,会发现只有业务操作才是核心逻辑,其他的功能都是非核心逻辑

2169839f39a7e45fe27852625439db2d.png

e9b58c04ae817ac2f074db9271797d6a.png

363a4aa8c02515837fbeaaf5ebe31f9b.png

3fd422f56462f60a4f88f07e4798920b.png

fbe3acdf8f54bf6107852f2aea9f1cc3.png

1f3492f53e9fbe9cd455a33989acfe90.png

b671a973e12d91438c2953f631c195f7.png

cb4f6dfdfc44d62a1a410482991496fb.png

1e89079870d7f683cba65210ba3b5378.png

4afc77fee361fa99145f123d72530d79.png

a48b05cb965f86a99a3d289fac9534a3.png

40a89ee27eaebb9048da7a990fc52135.png

888b324c792aa74a577816122204edf7.png

0bbdc6b36c046f4e1b693cf6ec6287eb.png

d3f2d609a199e15434cd0f43c3c2e674.png

a0ae61e48146df53d0f7c465c51b270d.png

88a1fe439914bdead57cdde777cc79ed.png

308207597db346b32feb780e70abb088.png

d1804c382563603339519825e3ea5937.png

84d22d4f78634cd3ba5979b503dfadbe.png

73452affba8c23f0b2d88904cd9d10c1.png

0ce13f567c52acfc43e75f7adaac8629.png

如果还是没有查到数据,则直接从数据库中获取到数据,然后放到caffine缓存中。

具体流程图如下:8a8b48817d186dea1433672c8e076032.png

79ca5af18629f4ee974571a5ba6a7740.png

如下图所示:1a0b806b0d71733ad3b8667dffa844fa.png图中将用户库拆分成了三个库,每个库都包含了四张用户表。

04ec928200a503860b175cc96d18a3b0.png

643db442c57647860eeea04e315f0dc0.png

524d1bbb68b5ce2c2d0afed8109fa6c9.png

为了出现sql问题时,能够让我们及时发现,我们需要对系统做监控

目前业界使用比较多的开源监控系统是:Prometheus

它提供了 监控 和 预警 的功能。

架构图如下:ba490ae7cb8cc266dacffb6ebeceaaf2.png

0a655ed61ef5e69a39588db9c430313a.png

b178a3df55be9d3f80dc7cbf11f8e3fc.png

1af6a16b45fac47e04c9a22a30d9ee43.png

d63ce935922ec2f114983c13367eed39.png

通过skywalking定位性能问题:60284b382d574f480489fedd143e2226.png

59fe9b2324d19b2326af373d56b16d89.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值