一个后端接口慢,你会如何解决?

396 阅读3分钟

问题产生

最近碰到一个被问两次的面试题, 回答并不好特此记录一下。

面试官问, 如果一个后端接口慢, 我们该如何尝试优化?

分析问题

碰到这个问题,很自然代入到自己如何尝试优化:

  1. 登录服务器或日志系统,根据日志记录找到耗时较多的代码块
  2. 根据该部分代码块,看是否存在优化空间,绝大部分这段代码是进行读写数据等IO操作
  3. 根据对应的数据库操作,优化SQL语句,该加索引加索引,该批处理就批处理
  4. 看上一步是否存在缓存空间,把能够缓存化的读IO操作缓存起来
  5. 梳理整体的逻辑流程,看是否存在优化空间

这是第一次回答的答案,显然结果并不理想,面试官的反馈也是,你只答出了一个点,且有瑕疵,还有很多要考虑的点没回答。

事后自己仔细思索,并上网查相关问题,发现确实漏了挺多点, 那么再次回答就该更全面:

回答问题

碰到接口慢,要考虑很多点:

  1. 常见的程序IO操作,如数据库读写, 这块优化索引、缓存
  2. 如果以上解决, 就要看Tomcat的JVM内存分配是否合理,查看gc日志
  3. 如果JVM不是瓶颈,那么服务器的配置是否跟不上了,要不要扩容
  4. 如果以上解决, 作为网络代理的nginx是否配置合理,要不要调整连接数和缓存区

回答以上几块,算是稍微全面了些。但是,每个点都能展开说很多,这就要看平时的功底了,我们简单展开几个:

数据库

  1. 数据库索引起到什么作用,为何加索引就快?索引越多越好吗?
  2. 数据库读写存在的事务隔离有哪些,有什么区别?
  3. 数据库的锁机制有哪些

JVM

  1. GC日志怎么看,如何判断JVM分区是否合理?
  2. JVM内存分区有哪些?分别有什么作用
  3. 了解JDK17的新增JVM吗,和默认的有什么区别?如何选择?

服务器配置

  1. 如何查看服务器的负载是否合理
  2. 如果要加配置的话,如何平稳的服务升级?
  3. 碰到过服务器宕机吗? 如何解决的

nginx

  1. 负载均衡策略有哪些,如何配置?如何选择?
  2. 如何优化nginx提升性能?
  3. worker 和 connections 是什么?要怎么配置更合理

更多个更细的问题

然而回答上面的问题,依然能能够深入更多的细节,这些细节并不是死记硬背就能回答的,更重要的是自己是否理解,是否能想出有逻辑的思路,想出思路的前提,是掌握了该领域的基本概念和最佳实践原理,基于此推理出来的。

功夫在平时

所以,更重要的是平时下功夫, 功夫花在打基础和理解原理上。

用费曼学习法来检测自己, 你能够用普通人都能理解的话讲出来,证明你真正理解了。