0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

18种接口优化方案汇总2

jf_78858299 来源:捡田螺的小男孩 作者:捡田螺的小男孩 2023-02-15 15:59 次阅读

6. 事件回调思想:拒绝阻塞等待。

如果你调用一个系统B接口,但是它处理业务逻辑,耗时需要10s甚至更多。然后你是一直 阻塞等待,直到系统B的下游接口返回 ,再继续你的下一步操作吗?这样 显然不合理

我们参考 IO多路复用模型 。即我们不用阻塞等待系统B的接口,而是先去做别的操作。等系统B的接口处理完,通过事件回调通知,我们接口收到通知再进行对应的业务操作即可。

如果大家忘记了IO模型,可以复习一下我的文章:看一遍就理解:IO模型详解

7. 远程调用由串行改为并行

假设我们设计一个APP首页的接口,它需要查用户信息、需要查banner信息、需要查弹窗信息等等。如果是串行一个一个查,比如查用户信息200ms,查banner信息100ms、查弹窗信息50ms,那一共就耗时350ms了,如果还查其他信息,那耗时就更大了。

图片

其实我们可以改为并行调用,即查用户信息、查banner信息、查弹窗信息,可以同时 并行发起

图片

最后接口耗时将大大降低 。有些小伙伴说,不知道如何使用并行优化接口?

我之前写过一篇文章并行优化接口的文章,保姆级别的!大家可以看一下,看完会有用的:后端思维篇,手把手教你写一个并行调用模板

8. 锁粒度避免过粗

在高并发场景,为了防止 超卖等情况 ,我们经常需要 加锁来保护共享资源 。但是,如果加锁的粒度过粗,是很影响接口性能的。

什么是加锁粒度呢?

其实就是就是你要锁住的范围是多大。 比如你在家上卫生间,你只要锁住卫生间就可以了吧 ,不需要将整个家都锁起来不让家人进门吧,卫生间就是你的加锁粒度。

不管你是synchronized加锁还是redis分布式锁,只需要在共享临界资源加锁即可,不涉及共享资源的,就不必要加锁。这就好像你上卫生间,不用把整个家都锁住,锁住卫生间门就可以了。

比如,在业务代码中,有一个ArrayList因为涉及到多线程操作,所以需要加锁操作,假设刚好又有一段比较耗时的操作(代码中的slowNotShare方法)不涉及线程安全问题。 反例加锁,就是一锅端,全锁住 :

//不涉及共享资源的慢方法
private void slowNotShare() {
    try {
        TimeUnit.MILLISECONDS.sleep(100);
    } catch (InterruptedException e) {
    }
}

//错误的加锁方法
public int wrong() {
    long beginTime = System.currentTimeMillis();
    IntStream.rangeClosed(1, 10000).parallel().forEach(i -> {
        //加锁粒度太粗了,slowNotShare其实不涉及共享资源
        synchronized (this) {
            slowNotShare();
            data.add(i);
        }
    });
    log.info("cosume time:{}", System.currentTimeMillis() - beginTime);
    return data.size();
}

正例:

public int right() {
    long beginTime = System.currentTimeMillis();
    IntStream.rangeClosed(1, 10000).parallel().forEach(i -> {
        slowNotShare();//可以不加锁
        //只对List这部分加锁
        synchronized (data) {
            data.add(i);
        }
    });
    log.info("cosume time:{}", System.currentTimeMillis() - beginTime);
    return data.size();
}

9. 切换存储方式:文件中转暂存数据

如果数据太大,落地数据库实在是慢的话, 就可以考虑先用文件的方式暂存 。先保存文件,再异步 下载文件,慢慢保存到数据库

这里可能会有点抽象,给大家分享一个,我之前的一个真实的优化案例吧。

之前开发了一个转账接口。如果是并发开启,10个并发度,每个批次1000笔转账明细数据,数据库插入会特别耗时, 大概6秒左右 ;这个跟我们公司的数据库同步机制有关,并发情况下,因为优先保证同步,所以并行的插入变成串行啦,就很耗时。

优化前1000笔明细转账数据,先落地DB数据库,返回处理中给用户,再异步转账。如图:

图片

记得当时压测的时候,高并发情况,这1000笔明细入库,耗时都比较大。所以我转换了一下思路, 把批量的明细转账记录保存的文件服务器,然后记录一笔转账总记录到数据库即可 。接着异步再把明细下载下来,进行转账和明细入库。最后优化后,性能提升了 十几倍

优化后 ,流程图如下:

图片

如果你的接口耗时瓶颈就 在数据库插入操作这里 ,用来批量操作等,还是效果还不理想,就可以考虑用文件或者MQ等暂存。有时候批量数据放到文件,会比插入数据库效率更高。

10. 索引

提到接口优化,很多小伙伴都会想到 添加索引 。没错, 添加索引是成本最小的优化 ,而且一般优化效果都很不错。

索引优化这块的话,一般从这几个维度去思考:

  • 你的SQL加索引了没?
  • 你的索引是否真的生效?
  • 你的索引建立是否合理?

10.1 SQL没加索引

我们开发的时候,容易疏忽而忘记给SQL添加索引。所以我们在写完SQL的时候,就顺手查看一下 explain执行计划。

explain select * from user_info where userId like '%123';

你也可以通过命令show create table ,整张表的索引情况。

show create table user_info;

如果某个表忘记添加某个索引,可以通过alter table add index命令添加索引

alter table user_info add index idx_name (name);

一般就是:SQLwhere条件的字段,或者是order by 、group by后面的字段需需要添加索引。

10.2 索引不生效

有时候,即使你添加了索引,但是索引会失效的。 田螺哥整理了索引失效的常见原因

图片

10.3 索引设计不合理

我们的索引不是越多越好,需要合理设计。比如:

  • 删除冗余和重复索引。
  • 索引一般不能超过5
  • 索引不适合建在有大量重复数据的字段上、如性别字段
  • 适当使用覆盖索引
  • 如果需要使用force index强制走某个索引,那就需要思考你的索引设计是否真的合理了

11. 优化SQL

处了索引优化,其实SQL还有很多其他有优化的空间。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 接口优化
    +关注

    关注

    0

    文章

    4

    浏览量

    1346
收藏 人收藏

    评论

    相关推荐

    电平转换方案汇总

    电平转换方案汇总
    发表于 04-05 22:18

    示波器探头接口整理汇总

    示波器探头接口整理汇总
    发表于 11-17 15:03

    分享一WLAN射频优化的解决方案

    分享一WLAN射频优化的解决方案
    发表于 05-24 06:29

    介绍一基于FIFO结构的优化端点设计方案

    本文介绍一基于FIFO结构的优化端点设计方案
    发表于 05-31 06:31

    分享一基于littlevgl2rtt软件包的RGB屏幕接口优化方案

    StudioOS版本:4.0.3开发板:Art-Pi + 正点原子4.3寸RGB屏软件包:Littlevgl2rtt(latest)温馨提示:下面的优化方案是基于该软件包的优化,如果
    发表于 06-07 14:57

    MSP430与I2C总线接口技术设计方案

    分析了MSP430 单片机I/O 端口的结构特点,提出了适合MSP430 特点的I2C 总线接口方案。该方案优化
    发表于 03-05 11:08 36次下载

    单片机接口资料汇总

    单片机接口资料汇总
    发表于 11-22 15:14 90次下载

    使用MSSP模块进行I2C串行EEPROM与PIC18器件的接口设计

    使用MSSP模块进行I2C串行EEPROM与PIC18器件的接口设计说明。
    发表于 05-11 10:23 11次下载

    通信协议及接口技术汇总综述

    通信协议及接口技术汇总综述
    发表于 06-16 10:31 89次下载

    ATA&USB接口资料汇总

    ATA&USB接口资料汇总
    发表于 06-24 09:54 3次下载

    MATLAB优化算法汇总01

    MATLAB优化算法汇总01
    发表于 10-08 10:57 0次下载

    MATLAB优化算法汇总02

    MATLAB优化算法汇总02
    发表于 10-08 10:59 0次下载

    MATLAB优化算法汇总03

    MATLAB优化算法汇总03
    发表于 10-08 11:01 0次下载

    18接口优化方案汇总1

    之前工作中,遇到一个`504`超时问题。原因是因为接口耗时过长,超过`nginx`配置的`10`秒。然后 真枪实弹搞了一次接口性能优化,最后接口从`11.3s`降为`170ms`。本文
    的头像 发表于 02-15 15:59 822次阅读
    <b class='flag-5'>18</b><b class='flag-5'>种</b><b class='flag-5'>接口</b><b class='flag-5'>优化</b><b class='flag-5'>方案</b><b class='flag-5'>汇总</b>1

    接口优化的常见方案实战总结

    针对老项目,去年做了许多降本增效的事情,其中发现最多的就是接口耗时过长的问题,就集中搞了一次接口性能优化。本文将给小伙伴们分享一下接口优化
    的头像 发表于 03-06 09:22 536次阅读