网站响应过慢问题
最近总是遇到很有意思的问题,在测试机上测试的时候,网站响应正常。一部署到线上就卡成狗。
原本以为可能上nginx配置不对。后来修改nginx配置发现没有什么用。后台log的记录的时候发现服务器响应请求过慢。
把逻辑梳理一下:网站本身其实就三个层次,用户页面;逻辑;读取持久层数据。
用户层面导致的慢可能有:nginx解析,第三方资源加载过慢,cdn,网络等。
逻辑层面:死循环,死锁,阻塞,复杂度过高。
持久层面:索引,全盘扫描,链表,缓存不命中。
仔细分析排查发现一个很有意思的事情,网站慢根本原因在于嵌套了三层以上的查询语句。代码的结构是这样的,每个相关的方法都封装了查询语句。在调用查询语句的时候,for循环下面调用另外封装好的方法,然后被调用的方法里面也有for循环,这样一算下来,复杂度至少变成了O(n^3) 。线上的数据有几百条,响应时间为55s,测试机上的几十条响应时间为3s。
最终解决方案,代码其实早已积重难返,没办法去做大幅度的结构拆分更改,因此在这里增加了缓存,速度果然变快不少。
反思:其实我们在写代码的时候,难免会遇到这样的情况,封装好的方法复杂度是O(n^2)调用方法是O(n) 执行时间复杂度一下子就膨胀了。
如何解决呢?
根据业务场景,我觉得解决方法有这样几种:
1.增加缓存。(很暴力很强大)
2.结构上优化:将读取数据库的方法封装好,在其上封装一层业务层,编写的时候注意复杂度。(目前项目中主要架构即是如此)
3.拆分复杂度,将O(n^3)变为几个O(n^2) 。尽可能的减少复杂度。