点击上方蓝色“方志朋”,选择“设为星标”

回复“666”获取独家整理的学习资料!

从OpenSearch中检索出数据,然后各种填充组装数据,最后返回。

逻辑看似很简单,当初我也是这样认为的,于是预估5天完成,最后前前后后开发、联调、改bug直到上线差不多花了10天(当然这10天并不是只做这一件事情)。

复杂在于影响返回结构的因素很多,排除问题需要检查配置、检查数据库、检查缓存、检查OpenSearch、检查代码。

言归正传,不管逻辑有多复杂,都不是你逃避问题的接口,更不是你不去优化的理由,这不是本文的重点,优化过程才是。

要求,给APP提供的接口一般要求响应时间在100ms以内。

第一次压测

惨不忍睹,平均响应时间150ms,而且在这次压测过程中还发现其它的问题,后台报错,经查是OpenSearch每秒查询次数限制

优化代码与配置

1、修改OpenSearch配置,并且将压测环境中的OpenSearch连接地址改为内网地址。

2、将代码中循环查询缓存的地方改为一次性批量查询返回。

3、和相关同学确认后去掉项目中无用的代码。

第二次压测

虽然优化了代码,修改了配置,但是情况更糟糕了,而且还改出了新的问题。

当时,反复检查了代码,确定查询缓存的次数已经是最少了,而且连接线程池相关参数也调到一个相对较大且合理的值了。

如果,再压测还是无法达到要求的话,只有出最后一招了:缓存结果集。

即,以用户ID和用户搜索的关键词为key,查询的结果为value,缓存5分钟。

第三次压测

总算符合要求了,并发60的时候响应时间达到32ms,而我又发现了新的优化点。

接口中居然还有查数据库的操作,这可不能忍,排查之后去掉了一些不必要的依赖。

成长

学会了使用RedisTemplate的executePipelined进行redis批量查询

针对本次优化的总结

1、一定要绝对避免循环查数据库和缓存(PS:循环里面就不能有查询缓存,更不能有查询数据库的操作,因为循环的次数没法控制);

2、对于API接口的话,一般都是直接查缓存的,没有查数据库的;

3、多用批量查询,少用单条查询,尽量一次查出来;

4、对于使用阿里云,要留意一下相应产品的配置,该花的钱还是得花,同时,千万要记得正式环境中使用相应产品的内网地址;

5、注意连接池大小(包括数据库连接池、Redis缓存连接池、线程池);

6、压测的机器上不要部署其它的服务,只跑待压测的服务,避免受其它项目影响;对于线上环境,最好一台机器上只部署一个重要的服务;

7、没有用的以及被注释掉的代码,没有用的依赖最好及时清理掉;

8、集群自不用说;

9、一些监控类的工具工具可以帮助我们更好的定位问题,比如链路跟踪,这次项目中使用了PinPoint;

10、如果技术上优化的空间已经非常小了,可以试着从业务上着手,用实际的数据说话,可以从日常的访问量,历史访问量数据来说服测试;

11、每一次代码改动都有可能引入新的问题,因此,每次修改代码后都要回归测试一下(PS:每次修改完以后,我都会用几组不同的关键词搜索,然后比对修改前和修改后返回的数据是否一致,这个时候postman,以及Beyond compare就派上用场了);

12、关键的地方一定要多加点儿日志,方便以后排除问题,因为排查线上问题最主要还是靠日志;

来源 | https://urlify.cn/uuYJvi

热门内容:
  • 腾讯,干掉 Redis 项目,正式开源、太牛逼啦!

  • 1.3 万亿条数据查询,如何做到毫秒级响应?

  • 一个架构师的缓存修炼之路

  • 还在用 BeanUtils来做对象转换吗?快试试 MapStruct吧

最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。
明天见(。・ω・。)ノ♡

最近做了一个搜索接口的优化,反复压测了四次,终于达到要求了相关推荐

  1. 用css3制作一个搜索框效果

    搜索框的形式有多种多样,今天试着用css3做了一个搜索框, html代码如下: <form class="form-wrapper">   <input type ...

  2. 接口性能优化怎么做?

    文章目录 为什么要做接口性能优化 怎样做接口性能优化,思路是怎样的 分析接口存在性能的根本原因 业务接口存在for循环调用 业务接口查db慢 复合场景,存在较多查询 接口勉强复合要求,但需要更高性能 ...

  3. 看看别人后端API接口性能优化的11个方法,那叫一个优雅!

    前言 接口性能优化对于从事后端开发的同学来说,肯定再熟悉不过了,因为它是一个跟开发语言无关的公共问题. 该问题说简单也简单,说复杂也复杂. 有时候,只需加个索引就能解决问题. 有时候,需要做代码重构. ...

  4. 看看别人后端API接口性能优化的11个方法,那叫一个优雅

    前言 接口性能优化对于从事后端开发的同学来说,肯定再熟悉不过了,因为它是一个跟开发语言无关的公共问题. 该问题说简单也简单,说复杂也复杂. 有时候,只需加个索引就能解决问题. 有时候,需要做代码重构. ...

  5. linux i2c 端口 usb,做了一个电容屏的IIC接口转USB

    做了一个电容屏的IIC接口转USB [复制链接] 实现的功能:电容屏的触控芯片一般对外接口为IIC接口,无法在windows/linux等电脑主机上直接使用,通过增加一颗转接芯片实现IIC接口转免驱U ...

  6. 基于雨流计数法的源-荷-储双层协同优化配置 代码主要做的是一个源荷储优化配置的问题

    基于雨流计数法的源-荷-储双层协同优化配置 主要内容:代码主要做的是一个源荷储优化配置的问题,采用双层优化,外层优化目标的求解依赖于内层优化的储能系统充放电曲线,基于储能系统充放电曲线,采用雨流计数法 ...

  7. 程序基于MATLAB yalmip 开发,做了一个简单的微网优化调度模型,模型中含有蓄电池储能、风电、光伏等发电单元,程序运行结果良好

    微网 优化调度 机组组合 YALMIP cplex 编程语言:MATLAB平台 主题:基于YALMIP 的微网优化调度模型 内容简介:程序基于MATLAB yalmip 开发,做了一个简单的微网优化调 ...

  8. mysql2013年8月怎么打出来_2020年8月31日,上周完成了一个查询接口来检查mysql的数据,速度很慢,20200831,从,MySQL,中查,贼...

    2020-08-31 上周完成一个查询接口,从MySQL中查数据,速度贼慢, 原因是数据5000万+,所以真正接触优化的机会来了,所以决定好好研究一下,做一个记录. 事情是这样的,mysql表中只有两 ...

  9. 接口监控_java应用监控之利用cat接口性能优化,每一次都是血的教训

    之前几篇文章对cat进行了简介.安装部署.代码埋点,今天分享一下如何利用cat帮助我们做接口优化. 为什么要接口性能优化? 1.用户体验差:接口访问速度慢.如果一个页面打开需要好几秒,用户可能在页面没 ...

最新文章

  1. java map深拷贝_java 实现Map的深复制
  2. NeurIPS 2020 | Focal Loss改进版来了!GFocal Loss:良心技术,无Cost涨点!
  3. 机器学习与统计学的争论,有意义吗?
  4. Spring Cloud 注册中心在tomcat中部署
  5. python零基础有用吗-10天搞定Python,告诉你有什么用?
  6. WIFI 一键配置原理-ESP8266
  7. Light OJ 1373 Strongly Connected Chemicals 二分匹配最大独立集
  8. linux常用的makefile模版编写
  9. BZOJ 4514 费用流
  10. 今日发现的:一个类似Google Baidu的搜索引擎[C#]代码比较简单
  11. 服务器向客户端不响应为null的属性(为了便于查询JSON数据)spring.jackson.default-property-inclusion=NON_NULL
  12. 木门怎么打_旧木门拆掉改成衣柜门,完工像收破烂的,要不是能省几个钱谁干?...
  13. WPF之DataGrid
  14. vmstat工具详解
  15. BC 2015在百度之星程序设计大赛 - 预赛(1)(KPI-树董事长)
  16. ECSHOP首页调用指定分类下的商品
  17. C++primer 6.7节练习
  18. 直接插入排序-java
  19. filenet安装-总结安装一天的成果
  20. 使用机器学习构建简单金融风控反欺诈模型(一)EDA+XGBOOST

热门文章

  1. VirtualBox装ghost XP
  2. vi 环境,跳转函数定义
  3. Android Drawable 详解(教你画画!)
  4. Linux shell 脚本报错:/bin/bash^M: bad interpreter: No such file or directory
  5. oracle rman异机恢复
  6. 未能加载文件或程序集“Report.Basic”或它的某一个依赖项。试图加载格式不正确的程序...
  7. hdu 5099 Comparison of Android versions 枚举题意
  8. hdu 3664 1~n排列(aii ) 为k个数
  9. NYOJ-232 How to eat more Banana
  10. 函数功能MATLAB