系统优化小记

测试一直嚷着app初始页面load时间过长,无奈的app开发和前端同学检查过后,把包袱扔给了我这个后台开发。查验后,发现一个初始化调用竟然用了400+ms,再加上网络延迟和app自身数据加载的时间,已经开始挑战用户的耐性。之前写代码完全对效率视而不见,逃避不是解决问题的方法,于是对这个调用分析了一番。

这个接口做的事情包括两方面:业务校验和初始化数据加载。最长的执行路径多达17个远程服务调用,这个17个服务中,耗时最长的达200多ms,最小的不到10ms,总的加起来妥妥的近500ms,不能接受啊!

优化主要从以下几个方面进行:

1. 去冗余。整理了业务,把每次调用的路径都罗列出来,发现不管是业务校验还是数据加载都是存在冗余的调用的,去掉冗余后,减少到了13个服务调用;

2. 数据缓存。两个最耗时的服务调用,一个是获取商品信息,一个是获取用户信息。商品信息是比较固定,几乎不会变,且数据对象小,完全可以在服务器做本地缓存,并设定每天从远程服务器重新获取一次。为了防止突发的商品信息更新,也做了可配置的缓存失效开关。用户信息也比较固定,但数据总量大,保存在本地不现实,于是放到了缓存服务器上。毕竟与整个集团业务相比,我们的业务用户只是其中很小一部分,把这小部分缓存起来对效率提升是很大的。这两个接口改造后,整个接口调用时间已经降到了一半以上。

3. 业务优化,不要为了1%而牺牲99%。1和2过后,再分析调用效率,大部分都不超过10ms,但还有一个校验接口接近40ms。这个接口调用的业务目的就是判断当前用户请求是否满足某条件,若不满足则给出错误提示,避免用户进入下一步执行一系列操作后才发现不满足条件,导致糟糕的用户体验。从这里来看,这个考量无可厚非。但进一步研究,这个接口不满足条件的情况其实是很苛刻的,在实际中几乎不会出现。但为了应对这种极端条件下才会出现的情况,每一个用户每一次正常的执行都必须执行这个调用,其实是得不偿失的。因此,果断把这个调用去掉。由此,事件已经降到50ms。

4. 远程调用接口合并。一次请求里里有10几个远程服务调用,想想就可怕,有些调用是可以合并的。合并的原则必须与业务特性挂钩,根据业务特征和接口设计来确定哪些调用可以合并。将多个接口合并为一个,减少的不必要的网络耗时。(后续进行该工作)

5. 校验与数据加载分离。该接口的执行顺序其实是先进行业务校验,再加载数据。若业务校验不成功,则直接返回。由此可见,业务校验和数据加载其实是可以分离的。划分为两个接口,app先调用业务校验,若成功,则进入下一个展示页面异步请求初始化数据。这也是优化的考虑之一,但经过前三步之后,初始化接口50ms的耗时已经在接受范围内,再分离接口,多一次的请求,反而会导致额外的耗时,可能适得其反。因此这一步的优化暂且放到一边。

其实简单的优化,暴露的是设计考虑不全面和编码的不规范,还是得从平时做起。

时间: 2024-10-10 21:12:35

系统优化小记的相关文章

SpringBoot - 二零一七0421小记

一.SpringBoot使用起来比起SpringMVC更便捷,在注解上的小变化,我记录了下面几个: @Controller + @ResponseBody = SpringMVC中用@RestController来代替前面两个注解,通过这个注解,可以将所有的前端http请求放入SpringBoot的Controller容器中,并返回json格式的数据给前端 @RequestMapping(value={"/hello","/hi"},method=RequestMe

广州postgresql用户会技术交流会小记 2015-9-19

广州postgresql用户会技术交流会小记  2015-9-19 今天去了广州postgresql用户会组织的技术交流会 分别有两个session 第一个讲师介绍了他公司使用postgresql -X2的情况 第二个讲师介绍了postgresql里面的一些执行计划分析 我个人比较关注第一个session,因为涉及到真正的应用案例 网上有对postgresql -X2的简短介绍,我先转载过来 转载:http://francs3.blog.163.com/blog/static/405767272

git 学习小记之记住https方式推送密码

昨天刚刚学了点git基础操作,但是不幸的是[email protected]给出公告说尽量使用 https 进行操作.可是在用 https 进行 push 时,都需要输入帐号和密码. 各种百度谷歌之后在[email protected]官网找到了解决方法<https方式使用[email protected]设置密码的方式>文中给出了几个方法,并且都非常简单. 关于 cache 缓存方式,我不太喜欢,因为要设置时间,而且会过期.而 store 相应的非常方便,设置全局后,方便多个库使用.当然如果

关于自动化部署之docker容器的折腾小记

docker的英文本意是码头工人,也就是搬运工,这种搬运工搬运的是集装箱(Container),集装箱里面装的可不是商品货物,而是任意类型的App,Docker把App(叫Payload)装在Container内,通过Linux Container技术的包装将App变成一种标准化的.可移植的.自管理的组件,这种组件可以在你的latop上开发.调试.运行,最终非常方便和一致地运行在production环境下. 具体什么是docker,你们自己找资料吧,应该好理解.   可以说是个运维的利器,可以把

安卓环境搭建小记

安装容易出现问题:1.更新sdk时可能无法连接服务器,可在C:\WINDOWS\system32\drivers\etc下的hosts文件最后添加:#Google主页203.208.46.146 www.google.com#这行是为了方便打开Android开发官网 现在好像不翻墙也可以打开74.125.113.121 developer.android.com#更新的内容从以下地址下载203.208.46.146 dl.google.com203.208.46.146 dl-ssl.googl

与webView进行交互,webView小记

本文转载至 http://www.verydemo.com/demo_c101_i46895.html 一.与webView进行交互,调用web页面中的需要传参的函数时,参数需要带单引号,或者双引号(双引号需要进行转义在转义字符前加\),在传递json字符串时不需要加单引号或双引号. 1 -(void)webViewDidFinishLoad:(UIWebView *)webView 2 { 3     NSString *sendJsStr=[NSString stringWithFormat

linux学习小记 (一 )

shell 学习小记: 注意:多看系统脚本  多模仿    su切换用户时需要输入目标用户密码,root(superuser)切换到任何用户都不需要输入密码,- 参数必须要是最后一个(su huhu -) sudo需要输入当前用户密码,拥有sudo特权的用户可以执行 "sudo su -"命令,使用自己的密码切换到root用户 , 所以应该在/etc/sudoers 文件中禁止 sudo 执行su命令 linux文件与颜色: /etc/DIR_COLORS   (命令dircolors

自由职业小记6

说说最近的情况 前段时间的小记里面有说到,我接了一个很糟糕的活.客户对技术没有任何了解,需求不明确,还总是改需求.原本3天就完成的工作,被断断续续的托了2个礼拜.至今最后的尾款也还没有打给我,目前已经打给我的金额大概是70%.在前面的几篇小记当中,我一直在说,目前我们这个阶段一定不能挑食,要尽可能的为顾客服务.虽然这段时间我也的确是这么做的,在我理解的工作范围内,继续给予这个客户技术支持.但是在态度上我基本上已经放弃了这个客户了.虽然说不挑食是我们目前来说的需要保持的一个态度,但是这样的客户的确

DOM性能小记

在使用DOM操作时,同样的效果用不同的方式来实现,性能方面也会有很大的差异.尤其在移动式设备上,资源本来就很有限,一旦DOM写不好的话操作就会非常卡顿.这个周末,就写个DOM性能小记吧.错漏之处,望多指教. 1.浅说reflow 首先讲讲最近我才了解到的一个比较深入且模糊的东西——reflow. 从字面上理解的话,reflow有回流.重排的意思.它是指在DOM内容更新或增删时发生的一个响应过程,可以理解为页面内容改变了,然后发生重新排版这样的一个行为.我们可以将执行DOM操作细分为以下三个过程: