这里有一份面筋请查收(六)


欢迎支持笔者新做:《深刻理解Kafka:核心设计与实践原理》和《RabbitMQ实战指南》,同时欢迎关注笔者的微信公众号:朱小厮的博客。
web


已经写到第六篇了,本文说的这家公司是博主投的最随意的,属于手滑点赞的那种。这里简称为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. 浅析数据一致性

欢迎支持笔者新做:《深刻理解Kafka:核心设计与实践原理》和《RabbitMQ实战指南》,同时欢迎关注笔者的微信公众号:朱小厮的博客。