后端开发面试: 某知名手机品牌的一次面试经历

今天去国内某知名手机公司面试java后端开发工程师,写下面试经历,以激励自己进步
主要面试问题有:

服务器部门几个人, 你负责什么?

我:总共3个, 设计,开发,运维,后端,前端全做。
(面试官非常惊讶,说他们后端有几百个人)

并发量有多少?

我:当然我也是如实回答,每秒几百个请求。但是有20万长连接终端同时在线。
(挽回一下面子吧。 小公司哪有什么并发量,大公司都号称每秒几千万请求数。)

你们文件服务的有多大的并发量,每天有多少数据量

我:每天2T的文件, 200万个文件
(大公司是不是2000PB?)

你们文件服务是怎么做的

我: 用java nio写的。
他:java最基础的接口 (很疑惑)?
( 后面发现不在一个频道上, 他以为是oss )

mysql优化的措施有哪些?

我: 把索引问题讲了一通,二级缓存讲了一通,分库分表讲了一通
他:除了这些呢
(当也没想出来, 估计应该再说说SQL优化什么的)

有没有用过mysql的自带的分库分表?

我: 没有

你说到做过数据同步,怎么做的,原理是什么?

我: 用的是阿里的一个开源工具otter, 它从mysql的binlog抽取日志然后同步到另一端
他: 如果出问题了怎么办?
我: (一时没答上来, 应该解释:otter会记录上次抽取的binlog的位置)

说一下mysql的事务隔离

我: 平常都是简单的操作, 没用过。
(汗,一时没想起来。 下次一定要好好的背背: 原子性, 一致性, 隔离性,持久性, 脏读, 幻读,不可重复读)

二级缓存怎么做的

我: ehcache
他: 为什么不用redis
我: ehcache和业务在同一个jvm中,效率最高。使用redis,担心单个redis抗不住
他: 那redis在你这个模块中有什么作用?
我: 消息订阅和发布,用来刷新缓存

redis的消息订阅与activemq的消息订阅有什么区别?

我: redis的是即时的, activemq用来保证消息一定被接收
(这里回答的不够专业。应该说activemq有三种策略:至少一次, 最多一次,恰好一次)

redis有哪些数据结构

我: redis是key-value的形式, 有set结构。 其它的忘了
(不是忘了,确实没用过其它的结构. 公司场景单一)

为什么要用ehcache, 场景不复杂,为什么不自己做?

我: 用到了ehcache的对象过期功能

ehcache的分布式有没有用过

没有

你长连接是怎么保持的?

(问的怪怪的), 靠心跳。
后来发现又不在一个频道上: 他以为是RPC相关的东西, 而我指的是websocket之类的东西
又解释了一通: 终端通过长连接连到长连接服务, 长连接服务再通过RPC与业务服务交互
(做web后端开发的,好像都不理解长连接的? 也可能是简历上解释的不够清楚)

你们为什么选择thrift RPC, 它与dubbo有什么区别

我: 第一眼看上的是它,thrift代码简单,方便定制, 但是需要事先通过接口描述文件生成代码,相当于硬编码。dubbo大而全, 也支持thrift协议,不需要硬编码。
(应该具体来讲: dubbo提供服务发现和监控, 具有可伸缩性,方便升级)

TCP TIME_WAIT过多怎么解决

我: 操作系统有个参数可以设置超时时间。服务端会开启reuseaddr

讲一下JVM内存管理

我: 年轻代,年老代,eden, s0, s1, 讲一通

你们后端还管维护?那你平常怎么调试jvm的

导出heap,分析对象泄露问题;导出线程堆栈,分析线程阻塞问题;打印gc日志,分析GC状况

线程有哪些状态?

我: 运行状态, 阻塞状态。 其它的状态没有关注.
( 这个没答好,估计会被认为不会多线程编程. 这个得背一下 )
初始状态:NEW
阻塞状态BLOCKED
可运行状态Runnable
终止状态TERMINATED
有设置超时的等待状态TIMED_WAITING
等待状态WAITING
如果这个答上了,那么下一个问题肯定是: 状态之间的是如何切换的

  1. 调用start之后, 进入runnable状态, 然后执行run()
  2. run()执行结束,或调用stop后,进入terminated状态
  3. running时,如果执行了sleep, wait, suspend, 或等待io操作相关操作之后,进入BLOCKED状态
  4. BLOCKED状态时,如果执行了resume, 或sleep结束,或被notify唤醒,继续进入Runnable状态

这里没有考虑CPU时间片对线程的影响
以上都答出来, 应该差不多了吧

http2与http1.1有什么差别

我: http2是二进制的,可以复用同一个socket来传输多个文件
(以下两个差别也得背一下)
使用报头压缩,HTTP/2降低了开销
HTTP/2让服务器可以将响应主动“推送”到客户端缓存中

http有哪些消息头

(我都一时被问懵了,不知道他是想哪个些方面。)
我: Authrizatoin, 用于认证,通常存放各种token. Content-Type, Content-Length, Chunked, 还有跨域相关的一些头。具体叫不出名称了。
(自己感觉没说到点上). 以下这些头应该答出来

  1. Set-Cookie, 服务器将cookie传给客户端
  2. Cookie,客户端将上次收到的cookie传给服务端
  3. X-Forwarded-For, 反向代理时,这个头标明客户端的源地址

websocket的原理

我: websocket是基于http协议,先经过http握手之后,然后保持socket通过

https握手过程

我: https是在ssl协议之上的,先要完成ssl握手。客户端发出hello,  附带上cipher suite, 服务端选择一个加密算法,发送证书,交换DHE, ECDHE相关的参数,双方生成master key.
(我提到ssl, 或tls, 但他好像不太了解这是什么,只是强调https. 我严重怀疑又不在一个频道上了)
他: hello的格式是什么?
我: Handshake的一种格式 
(我估计是因为不在一个频道上,才导致他提出了这个莫名的问题)

你们为什么使用框架访问数据库?

我: 用框架简单

我看到你有用hibernate, 是使用spring mvc吗

我: 现在都是做成前后端分离的了, 不再使用mvc

你后端部门还要做前端, 用的什么技术?

我: 是的,后端前端都做,用的是现在很流利的一个轻量级js框架 vuejs

主从选举的原理说一下

我: 每个节点都发出一个投票,节点ID大的有更大的权重,获得到超半数投票的节点作为master

有遇到过双主问题吗,什么情况下会出现,出现后怎么解决

我: 我没遇到过。宕机重启之后有可能出现。我会把投票结果保存在文件中。
答的有点肤浅。应该这么答:
当master宕机时立刻恢复之后,一部分主机已经选出了新的master. 而另一部分发现原master已经恢复了,没有跟随新的master,导致双主问题
解决措施: 忘了, 等我看看代码再写

猜你喜欢

转载自blog.csdn.net/wzj_whut/article/details/87814790