1.项目中遇到的比较棘手的问题,如何解决的。
第一个方向是设计模式在项目中的应用,遵循一系列的开发原则,设计模式都是前人总结出来的经验,对我们的开发有指导意义。
之前没有用设计模式,所有的登录都糅合在一个业务类中。但是发现需求经常需要改,登录方式经常会增加或者更换,
每次都要修改业务层代码。
经过我的设计,使用了工厂设计模式和策略模式,解决了经常修改业务层代码的问题。登录代码
责任链模式,开始出现了xxx问题,不断的尝试调研解决方案,最终解决问题。
第二个方向是线上的bug,作为程序员,我们开发的项目经过测试人员的测试之后,投入生产环境。
虽然测试环境测试没有bug,到了线上就会出现很多bug,因为在线上,测试环境中不好复现,所以
不好解决。
或者说项目上线初期没有问题,运行一个月之后,出现了CPU飙高,内存泄漏,线程死锁,都需要在
线上调试找到问题,这个调试问题也是比较困难的。
第三个方向是调优,这里最好说一些指标数据,比如接口比较慢,调优之前访问的耗时是2s,
调优之后访问的耗时是500ms。
中间调优的过程要重点讲:比如可能是SQL的问题,优化了SQL,加了索引,或者是添加了缓存,
或者是集群方案,高可用等方案都可以说
第四个方面是组件的封装,比如分布式锁和接口幂等算是比较小的解决方案,比如很多项目
中都会使用到分布式锁和接口幂等,所以可以尝试封装一个小型的工具或者组件。让多个项目
都能使用,这个封装也是不容易的,一般都是高级开发工程师去完成。
支付和分布式事务算是比较大的组件,就可以单独封装成一个通用的服务,这个难度要高一些。
还要考虑服务的高可用和通用性才行。
如果做过组件封装,可以聊这一方面的内容。如果没有这方面的经验,可以找一些文章参考。
2.你们项目中日志是如何采集的?
采集日志的原因:日志是定位系统问题的手段,可以根据日志信息快速定位系统中的问题。
采集日志的方式:1.ELK:ES、Logstash和Kibana三个软件的首字母
2.常规采集:按天保存日志文件到一个专门的日志目录
回答面试官:我们搭建了一个ELK的日志采集系统,
Elasticsearch是全文搜索分析引擎,可以对数据存储、搜索、分析
主要是对日志数据进行存储、搜索和分析
存储的时候一般都是按照日期进行存储的
Logstash是一个数据收集引擎,可以动态收集数据,可以对数据进行过滤、分析,
将数据存储到指定的位置
主要是用来收集数据的,收集系统所产生的日志的数据
Kibana是一个数据分析和可视化平台,配合Elasticsearch对数据进行搜索,分析,
图表化展示
3.查看日志的命令(考察是否在线调试过项目,如果调试过项目,会经常查看日志文件)
有了ELK,就免去用命令查看日志了。但是作为高级开发,通过命令查看日志也需要掌握。
目前采集日志的方式:按天保存到一个日志文件
比如 项目名称-端口号-日期.log,可以通过配置的方式来调整日志的命名
在logback配置文件中,就可以设置日志的存放目录,还有命名的规范也可以按照项目的
要求设置
有了日志文件之后,如果项目报错了,就可以通过查询日志解决问题。
一般我们的项目都是部署在Linux系统当中,检索这些日志也都是Linux系统中查看
1.实时监控日志变化:
实时监控某一个日志文件的变化:tail -f xx.log
实时监控日志最后100行日志:tail -n 100 -f xx.log
2.按照行号查询:
查询日志尾部最后100行日志:tail -n 100 xx.log
查询日志头部开始100行日志:head -n 100 xx.log
查询某一个日志行号区间:cat -n xx.log | tail -n +100 | head -n 100
3.按照关键字找日志的信息:
查询日志文件中包含debug的日志行号:cat -n xx.log | grep "debug"
4.按照日期查询:
5.日志太多,处理方式:
日志太多,拆分日志,分页查询日志:cat -n xx.log | grep "debug" | more
筛选过滤后,输出到一个文件:cat -n xx.log | grep "debug" >debug.txt
4.生产环境的问题怎么排查:
已经上线的bug排查的思路:
1.先分析日志,通常在业务中都会有日志的记录,或者查看系统日志,或者查看
日志文件,然后定位问题。
2.远程debug(公司的正式环境(生产环境)不允许远程debug,一般debug都是
公司的测试环境,方便调试代码)
远程debug的前提条件:远程的代码和本地的代码要保持一致
1.远程代码需要配置启动参数,把项目打包放到服务器后启动项目的参数
2.idea中设置远程debug,找到idea中的edit configurations,在这里面添加一个
remote JVM Debug
3.idea中启动远程debug 启动remote-test
4.访问远程服务器,在本地代码中打断点即可调试远程
5.怎么快速定位系统的瓶颈(考察是否有线上调试问题的经验)
1.压测(性能测试):压测就是对系统的性能测试,项目上线之前测评系统的压力
压测目的是在项目上线之前尽可能找出系统的瓶颈并修复
压测目的:给出系统当前的性能状况,定位系统性能瓶颈或潜在的性能瓶颈
指标:响应时间、QPS、并发数、吞吐量、CPU利用率、内存使用率、磁盘IO、错误率
压测工具:LoadRunner、Apache Jmeter
后端工程师:根据压测结果进行解决或调优(接口慢、代码报错、并发达不到要求)
2.监控工具、链路追踪工具:系统上线之后进行监控
监控工具:Prometheus+Grafana
链路追踪工具:skywalking、Zipkin
3.线上诊断工具Arthas(阿尔萨斯):项目上线之后监控、排查,是阿里推出的一个工具
Arthas是阿里巴巴开源的Java诊断工具