已经写到第六篇了,本文说的这家公司是博主投的最随意的,属于手滑点赞的那种。这里简称为V,最后也是选择了这家。博主会把简历挂在猎聘网上让猎头来找,然后把自己的简历给猎头,有心思的猎头还会修改一下简历。至于在猎聘网上填写的简历有很多条条框框,一般看到一家比较感兴趣的也会去拉勾网上搜一下,然后在拉勾网上头,拉勾网在这点上做的不错。当时看到公司V觉得也是一家知名企业,就点了发送简历,忘了去拉勾上搜一下了,而且职位介绍也没注意。后来面试的时候面试官解释了一下这个职位,感觉很有吸引力。当时二面和三面之间W公司发来一个offer,差不多就拒掉了。置之死地而后生,不然没动力继续面试的。

一面也是电面,因为不在一个城市。之后的二三四面都是去公司面的。

###一面
当天和面试官约好晚上19:30面试的,果然也是准时的,整个面试过程持续了45mins左右。面试官人很好,问的问题比较细腻。问的大多是网络的问题,博主写过通讯程序,但是对计算机网络没有很深的了解,最近面试也没准备过网络相关的知识,只是看了下Java相关的,对于计算机网络只能靠回忆啦。
1.TCP/IP协议相关的
TCP的三次握手是什么?为什么要三次握手?不是三次可不可以?
TCP的关闭连接有哪些动作?(四次挥手)?TCP和UDP的区别?端口号位于几层协议?
以上这些TCP/IP有一定了解的人一般都能回答。
之后问了一个问题,在四次挥手的过程中有两个状态TIME_WAIT和CLOSE_WAIT之间会发生一些异常情况,你知道是什么么?有知道答案的小伙伴请在下方告知。
TCP的流量控制怎么解决?(滑动窗口)
TCP的拥塞控制怎么解决?(这个没答上来,之后翻看了下资料,还是有点复杂的。涉及慢开始和拥塞避免,快重传和快恢复。)
2.Keepalived基于几层协议?LVS基于几层协议?
简历上写了这个所以被问也是很正常。
答案:Keepalived工作在3,4,7层上。第三层:Keepalived会定期向服务器集群中的服务器发送一个ICMP的数据包,如果发现某台服务器的IP地址没有激活,Keepalived便报告这台服务器失效。并将它从服务器集群中提出。第四层:主要以TCP端口的状态来决定服务器工作正常与否。第7层:根据用户的设定检查服务器程序的运行是否正常,如果与用户的设定不相符,则Keepalived将把服务器从服务器群中剔除。LVS(LVS-TUN, LVS-NAT)工作在4层协议上,但是也有人说LVS-DR是基于物理链路层的,所以也是可以理解的。
3.聊聊NIO以及React模式详解。
关于NIO网上有很多资料,可以自行查阅,也可以看一下这一篇《攻破JAVA NIO技术壁垒》。
之后好像问了个问题:NIO的Reactor模式和设计模式中的观察者模式有什么区别?观察者是基于单事件源的,而Reactor模式是基于多事件源的。
4.客户端连接服务器,绑定了错误的IP地址和端口号会有什么现象?
这个博主再写IO程序的时候还真没有注意过,只蒙了一个Connection refuse的答案。细节决定成败啊。后来通过程序BIO和NIO两种方式分别试了一下。NIO的方式在IP不通或者端口不正确的情况下都没有任何异常。BIO的方式在IP不通的情况下没有异常,端口不通会报异常:Connection refused: connect。

当然也问了点纯Java的,很少,记不住问什么了(好像有一题:HashMap和数据结构中HashTable的区别),应该是比较常规的问题。如果不是常规的肯定不会遗忘了。后来面试结束前问我有么有什么问题想问的。我说:有没有什么建议?面试官说:他面过很多人,一般都不看重以前学校里学的基础知识,认为在工作中并没有太多的联系。其实工作越久会发现基础知识很重要。


###二面
二面是V公司的高级经理,管技术的,应该是这个职位的领导。问了点Java基础的问题,比如GC相关的知识,那就从GC Roots, 分代,Serial, ParNew, Parallel Scavenge, Serial-Old, Parallel-Old, CMS等来一遍。
好像是还问了一个CMS什么时候发生Concurrent Mode Failure. Java基础问的很少,大多数是问分布式架构相关的。
首先在位置上问了一个:分布式内存怎么和数据库之间确保数据一致性?这个问题在前面的博文中也也有涉及。博主的回答大致是(一种解决方案):将某个库上的某个key要发生的写操作,记录在缓存中,并设置“经验主从同步时间”的缓存超时时间为500ms,这时间是指数据库主备同步的时间不会超过500ms,但是也有可能发生超过500ms的现象,当然可以设置的更久一点,只会偶尔发生最终一致性问题,大多数时候可以保证强一致性。由于一般数据库是读写分离的,写的时候将写的操作在数据库中执行并存入缓存设置超时时间500ms,当读的时候,先查缓存Redis,如果有相关记录则从Redis中返回,如果没有则说明已经同步到负责读的数据库中了,可以直接从读数据库中读取数据,这样也能做到读写数据库的分离。
有关数据一致性问题可以参考《浅析数据一致性》。
之后就找了两支笔,一人一只,然后在黑板上画了个图,基本是:App-缓存-数据库三者之间的关系,然后让我论述下。我看过很多分布式框架之间的资料,虽然现在的工作没有太多机会去实践,但是还能说个一二。基本上说了一通:负载均衡,流控,幂等性设计,数据一致性,缓存命中率,缓存失效,异常处理等。最后问了个如果缓存爆了,所有流量进入了数据库怎么处理,当时博主没想出来,只在读写分离上停留,后来面完下电梯的时候想起来分表分库的操作。


###三面
三面的面试官就是一面的面试官,问了一些价值观,对行业的看法,以及也问了些技术性问题。比如在二面中也被问及的问题:一条数据写入时先写入数据库还是先写入缓存?


###四面
四面的面试官比较有个性,有个小胡须。对简历上的信息问了一遍,技术性的问题没怎么问。
比如,看到我简历上的学校(211的,简历上写的本硕是一个学校,年级排名都是前5%,拿过一些奖学金神马的)问我当时怎么没想考研?比如博主同城的两所985学校?我说当时想过,认真研究了一番只想考上交大,但是比对前一年的入取情况,入取分数很高而且二面的通过又非常的低,所以就选择报送本校这样简单很多。面试官说:原来这么难考,我还不知道,我就是上交大的。
囧。。这都能撞上。。。。看我对上交大比较憧憬是不是要加点分。哈哈。


更多链接请关注:
这里有一份面筋请查收(一)
这里有一份面筋请查收(二)
这里有一份面筋请查收(三)
这里有一份面筋请查收(四)
这里有一份面筋请查收(五)
这里有一份面筋请查收(六)
这里有一份面筋请查收(七)
这里有一份面筋请查收(八)

参考资料

  1. 攻破JAVA NIO技术壁垒
  2. 浅析数据一致性


这里有一份面筋请查收(六)_服务器