开发过程中遇到问题如何排查?
个人总结,如有问题,积极讨论。
网络问题
应具有的知识背景
常见的HTTP请求路径(带域名)
该路径只是大概的情况,因为网络路径的复杂程度是无法简单摸清的,而且很多路径中的网络设备对用户来说是透明的。
浏览器输入----【浏览器缓存】----【本机DNS缓存】----通过DNS服务解析得到IP----网关----【正向代理】----【CDN】----【反向代理】----实际服务----存储(各种存储数据的媒介:数据库、缓存等等)
如何排查和快速定位?
遇到问题时,根据问题的情况,选择合适的方法,往往还需要多个方法结合进行排查和定位问题。
排除法
适用于无法一下子确定具体原因的情况。
如果一个地址突然打不开,那你可以把地址发给同事或者使用自己的手机移动网络尝试打开。
- 别人能打开就是自己的网络异常
- 别人不能打开,那么大概率就是服务异常
日志分析法
适用于知道某个服务出问题,但不确定具体原因的情况。
一般的服务都会有日志输出,方便排查问题,如果知道哪个服务出了问题,那么去查看她的运行日志一般就能知道具体原因。
数据模拟法
适用于一些特定条件下才出现的问题,需要指定条件的情况。
如果问题在特定条件才发生,那么模拟那个出现问题的环境是比较好定位问题的方法。
抓包法
适用于非常用协议,或协议对接开发的情况。
如果在协议对接过程中数据无法识别,通过抓包与标准的例子进行数据对比,能看出问题所在。
常见软件:wireshark
经验法
适用于已经踩过的坑。
链路跟踪法
适用于有完善的链路跟踪服务部署情况。
到链路服务查看数据,就能快速定位。
非网络问题
这里指开发中的程序问题,不涉及与其它服务交互。
如何排查和快速定位?
遇到问题时,根据问题的情况,选择合适的方法,往往还需要多个方法结合进行排查和定位问题。
Debug
函数不及预期时,通过调试断点查看运行时数据,就能准确定位问题。
Log
在无法打断点的时候,通过打log能实现相同效果。
单元测试法
如果修改的函数早已配套单元测试函数,那么运行一下单元测试,更快发现问题。