斗鱼提前批服务端SP面经总结+建议
一面30min,重基础,几乎没问项目。没有自我介绍,而是面试官看着简历问问题。(乱序)
1.TCP三次握手怎么回事? 答: 流程+两个原因
2.TCPUDP区别是什么? 答:网上常规答案。然后又补充说,二者不同的特点对应着不同的适应场景,如视频可以用udp,像QQ打字通信应该tcp。直播中主要用的是基于tcp的RTMP协议,但是udp也有一定的应用,比如YY的直播就是基于udp实现的私有协议。 问: 你怎么知道它们用什么协议的? 答:YY的协议是在网上了解到的,斗鱼的协议我就比较了解了,因为我在斗鱼有直播间,每次开播的时候需要推流软件填写RTMP服务器URL和推流码。推流码应该是用于身份识别的,避免非斗鱼主播的用户占用推流服务器。 面试官又多问了几句,用斗鱼播什么(游戏,有时候敲代码),有人看嘛有人送礼物吗(有,不多)。 气氛就变轻松了。
3.JVM内存模型能说一下吗?在方法内和类内定义这个: A a = new A() ,引用和对象分别在哪里? 答:内存模型4个区说一下。 new出来的对象一定在堆。如果是类中,那么这个引用a就是类的属性了,在方法区。如果在方法中定义的,那就在虚拟机栈的栈帧中。
4.Java中如何使用多线程技术? 答:首先答创建线程的主要方法(继承Thread 或实现Runnable),重载run方法然后start调用。 高级一点的可以使用线程池,可以避免线程频繁创建和销毁的开销。
5.线程安全的集合类了解吗? 答:HashTable ConcurrentHashMap的实现区别 答了。
6.数据库的引擎了解吗,InnoDB MyIsam区别说一下? 索引的优点和缺点? (这个问题比较常规,网上一堆总结。另外可以从底层B+树存储key value的差异来解析两种引擎索引的区别)
7.Redis了解吗,有几种数据结构? 答:字符串 哈希 list set sortedset
8.Linux常用命令有哪些? 有个看日志的是什么? 答:常用的ps find grep 等。 看日志用tail -f实时查看,-n可以指定查看尾部多少行。
9.Springboot中常见的注解有哪些? 答: Component Configuration Controller RestComtroller Service 等。 C和RestC的区别? 答:RestC返回值的就是响应体,Controller返回的值经过视图解析器对应到其他页面,Controller加个@ResponseBody注解可以成为RestC的效果。
等了十分钟后,二面40min左右 项目问了不少
1.介绍下自己,说一个觉得比较成功的项目。 答了一个HTTP服务器嵌入Android设备的项目。
2.项目中轻量级HTTP服务器是怎么实现的? 答: github上找了一个,然后按照项目需求把同步方式 路由配置等参数进行了修改。
3.常见的HTTP状态码有哪些?什么意思? 答:200OK 500内部服务器错误 404NotFound 403未认证 还有两个3字头的表示重定向,具体记不清了。
4.有没有做过网站相关的后台项目? 答: 做了一个宠物商店图片视频等信息的展示系统(很小但是上线了的一个项目),用的Springboot+Mysql+Redis
5.哪个地方用到Redis了?Redis的几种数据结构各自有什么用? 答: 用Redis存放被高频访问的信息,提升读性能。 用途方面,普通的字符串用处很广泛;曾经用Redis的List模拟过消息队列;Set没用过,但是感觉可以用来存放用于判断的信息,比如一个用户id不在某Set中,即判断他没有某权限;哈希可以用于存放对象信息,把对象属性作为哈希的键和值。
6.Mysql的事务隔离级别说一下,分别可能产生哪些问题? 答:(这个问题也比较常规了。但是第三个级别也就是默认级别的名字我忘记了)blablabla. 问:最高的隔离级别串行化,具体是怎么操作的?如果两个事务操作的记录行数不同的话,可以同时执行吗? (这个问题我不太确定,当时答的是即使不同也不行)
7.TCP三次握手四次挥手的过程和原因? 最后是谁要处于TIME WAIT状态? 答:常规问题,常规答案。
8.如果客户端想上传一个很大的视频,服务器端该怎么处理? 之前没有接触过这块,但是想了一下觉得应该是切片,小块小块地上传,就具体回答了一下。 回答完,我又扯到了跟分片上传很像的HLS直播协议,进而是斗鱼直播所用的RTMP协议,面试官对这个很感兴趣,这块问题我们讨论了很久。问我怎么接触到这个的,我说在那个小项目里一开始想用RTMP做一个小直播,但是因为要用FLASH就放弃了,然后又问了一下斗鱼应该是自研了一个播放RTMP流的前端播放器吧。后面我和面试官又讨论了RTMP和HLS等协议的区别,前者基于TCP后者基于HTTP,另外还有基于UDP的一些私有协议,它们的实现方式所决定的时延和性能消耗等的区别。 面试官对这块很满意,说看得出来你还是做了很充分的相关的学习和了解的。
9.JVM内存模型?如何GC进行优化? 答:内存模型答了。 优化方面,要结合具体业务和内存占用情况,另外要根据需求选择对应gc收集器,如要控制吞吐量就用G1,要最短停顿就用CMS,然后顺带着提了一下CMS的优缺点。
10.除了Java还会别的语言吗?对GO有了解吗? 答:还会Python和C++,对Go用过一点但是了解得不深。 面试官就表现出很强的问Go的欲望,说那我问你一些Go的问题吧,我说我估计深一点的都答不上来,因为只是项目过程中一个工具要用Go编译,所以体验过一些,也试过用Go十行写出来一个Http Server,他就没问Go了。 然后又讨论了一下语言差异,说了一下为什么我选择Java(速度快+不用太操心内存管理);Python开发效率快但是运行慢;Go也是编译型的所以也很快。面试官说现在一个大型的网站,服务端这块几乎不会选择用单一的语言去完成。
11.你有没有什么问题要问? 问了一下部门负责的业务以及主要的技术栈;另外问了一下斗鱼加班的情况。 主要语言是GO其次是Java。 斗鱼加班不多,相对轻松一点。
这次我自认为最大的成功之处在于,回答完面试官问的问题Tcp和文件上传问题之后,成功延伸到了RTMP HLS等直播协议。因为之前为了我的小项目确实有了解过这块,加上马上要面斗鱼了,就总结、整理了一下,结果派到了很大的用场,给面试官留下了很好的印象,体现出了自己探究问题的能力和对斗鱼的诚意。当然了,这些都是锦上添花的点,如果问的基础的问题答得不尽人意的话,最后还是会一个凉凉送给自己的。 关于延伸问题这块,这是很重要的一点,因为面试官问问题不是为了刁难我们,而是为了摸底,了解我们到底掌握哪些技能到哪种程度;如果你能将你掌握的技能/知识点整理出一个能够相互联系的结构(技能树、知识树),当面试官问你一个问题后,你先把它回答出来,然后如果可以向更深入的方向延伸,或者另一个知识点跟这个的原理类似,你都可以去告诉面试官,我还对xxxx有所了解,这个跟xxx是差不多的,面试官可能选择让你继续说下去的。
不知道有没有同学跟我有类似的情况:实习经历虽然有,但是不是后台的岗位(我一段测开实习一段Android系统开发实习)。这种情况下如果你想要投后台,可能需要将实习所做过的项目中跟后台相关的东西突出一下,比如涉及到HTTP的内容之类的;另外,最好还是有一个纯后台的项目,不管是慕课上去跟着做还是学完框架之后自己试着开发一个demo(但是尽量不要去做那种xxx员工管理系统,我感觉面试官一眼就看出来是水的),多去想想有没有自己能用后台开发技术解决的实际问题,比如我做这个宠物商店信息,缘由是我姐最近在做my god生意,在朋友圈发宠物的视频,我就想着能不能做个小平台让她用,实际上整个项目的逻辑很清晰很简单,但是确实很有用,证明自己有相关的技术栈的实用经历。
祝大家武运昌隆,早日上岸。