最近做了一个搜索接口的优化,反复压测了四次,终于达到要求了
点击上方蓝色“方志朋”,选择“设为星标”
回复“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 领取,更多内容陆续奉上。
明天见(。・ω・。)ノ♡
最近做了一个搜索接口的优化,反复压测了四次,终于达到要求了相关推荐
- 用css3制作一个搜索框效果
搜索框的形式有多种多样,今天试着用css3做了一个搜索框, html代码如下: <form class="form-wrapper"> <input type ...
- 接口性能优化怎么做?
文章目录 为什么要做接口性能优化 怎样做接口性能优化,思路是怎样的 分析接口存在性能的根本原因 业务接口存在for循环调用 业务接口查db慢 复合场景,存在较多查询 接口勉强复合要求,但需要更高性能 ...
- 看看别人后端API接口性能优化的11个方法,那叫一个优雅!
前言 接口性能优化对于从事后端开发的同学来说,肯定再熟悉不过了,因为它是一个跟开发语言无关的公共问题. 该问题说简单也简单,说复杂也复杂. 有时候,只需加个索引就能解决问题. 有时候,需要做代码重构. ...
- 看看别人后端API接口性能优化的11个方法,那叫一个优雅
前言 接口性能优化对于从事后端开发的同学来说,肯定再熟悉不过了,因为它是一个跟开发语言无关的公共问题. 该问题说简单也简单,说复杂也复杂. 有时候,只需加个索引就能解决问题. 有时候,需要做代码重构. ...
- linux i2c 端口 usb,做了一个电容屏的IIC接口转USB
做了一个电容屏的IIC接口转USB [复制链接] 实现的功能:电容屏的触控芯片一般对外接口为IIC接口,无法在windows/linux等电脑主机上直接使用,通过增加一颗转接芯片实现IIC接口转免驱U ...
- 基于雨流计数法的源-荷-储双层协同优化配置 代码主要做的是一个源荷储优化配置的问题
基于雨流计数法的源-荷-储双层协同优化配置 主要内容:代码主要做的是一个源荷储优化配置的问题,采用双层优化,外层优化目标的求解依赖于内层优化的储能系统充放电曲线,基于储能系统充放电曲线,采用雨流计数法 ...
- 程序基于MATLAB yalmip 开发,做了一个简单的微网优化调度模型,模型中含有蓄电池储能、风电、光伏等发电单元,程序运行结果良好
微网 优化调度 机组组合 YALMIP cplex 编程语言:MATLAB平台 主题:基于YALMIP 的微网优化调度模型 内容简介:程序基于MATLAB yalmip 开发,做了一个简单的微网优化调 ...
- mysql2013年8月怎么打出来_2020年8月31日,上周完成了一个查询接口来检查mysql的数据,速度很慢,20200831,从,MySQL,中查,贼...
2020-08-31 上周完成一个查询接口,从MySQL中查数据,速度贼慢, 原因是数据5000万+,所以真正接触优化的机会来了,所以决定好好研究一下,做一个记录. 事情是这样的,mysql表中只有两 ...
- 接口监控_java应用监控之利用cat接口性能优化,每一次都是血的教训
之前几篇文章对cat进行了简介.安装部署.代码埋点,今天分享一下如何利用cat帮助我们做接口优化. 为什么要接口性能优化? 1.用户体验差:接口访问速度慢.如果一个页面打开需要好几秒,用户可能在页面没 ...
最新文章
- java map深拷贝_java 实现Map的深复制
- NeurIPS 2020 | Focal Loss改进版来了!GFocal Loss:良心技术,无Cost涨点!
- 机器学习与统计学的争论,有意义吗?
- Spring Cloud 注册中心在tomcat中部署
- python零基础有用吗-10天搞定Python,告诉你有什么用?
- WIFI 一键配置原理-ESP8266
- Light OJ 1373 Strongly Connected Chemicals 二分匹配最大独立集
- linux常用的makefile模版编写
- BZOJ 4514 费用流
- 今日发现的:一个类似Google Baidu的搜索引擎[C#]代码比较简单
- 服务器向客户端不响应为null的属性(为了便于查询JSON数据)spring.jackson.default-property-inclusion=NON_NULL
- 木门怎么打_旧木门拆掉改成衣柜门,完工像收破烂的,要不是能省几个钱谁干?...
- WPF之DataGrid
- vmstat工具详解
- BC 2015在百度之星程序设计大赛 - 预赛(1)(KPI-树董事长)
- ECSHOP首页调用指定分类下的商品
- C++primer 6.7节练习
- 直接插入排序-java
- filenet安装-总结安装一天的成果
- 使用机器学习构建简单金融风控反欺诈模型(一)EDA+XGBOOST
热门文章
- VirtualBox装ghost XP
- vi 环境,跳转函数定义
- Android Drawable 详解(教你画画!)
- Linux shell 脚本报错:/bin/bash^M: bad interpreter: No such file or directory
- oracle rman异机恢复
- 未能加载文件或程序集“Report.Basic”或它的某一个依赖项。试图加载格式不正确的程序...
- hdu 5099 Comparison of Android versions 枚举题意
- hdu 3664 1~n排列(aii ) 为k个数
- NYOJ-232 How to eat more Banana
- 函数功能MATLAB