2020-5 某游戏公司面试过程

更多文章收录于Github地址:https://github.com/tony-wnx/DailyImprove


2020-5 某游戏公司面试过程

面试一共四面,一面项目组老大(进公司后在他这边工作),问了简历上的很多技术,问的程度有深有浅吧;二面HR面(感觉顺序有点乱啊),大概问了下为什么离职、职业规划、期望薪资、对加班的看法等;三面技术委员会成员,一看资历就很老,不过人挺好的,问的偏框架底层源码实现,比较高深;四面不知道具体职位,不过问的技术偏多,应该也是个搞技术的吧,问的偏实际问题的具体解决方案,给你一个特定的场景,你给出具体的解决方案;

1.自我介绍

2.工作中JVM实际问题的排查和解决

  • 回答的是一个关于元数据空间内存溢出的情景
引申出的问题
  • 元数据区存放哪些数据,永久代存放哪些数据?
    • 回答:元数据区存放和永久代中一样的数据,被虚拟机加载的类信息、静态变量、常量
  • int a = 5;是在哪个区域分配?
    • 回答:在范围-128~127之间是在常量池中,超过后在堆内存分配
      在java中只要是成员变量,一旦它所在类被实例化后,都是放在堆内存的,不管它是不是基础类型。局部变量放在栈内存的。

3.ES使用的客户端、版本号、搜索怎么实现的分页

tomcat              latest              31a47677561a        4 weeks ago         529MB
zookeeper           latest              4f58c04512fb        4 weeks ago         252MB
mysql               5.7                 413be204e9c3        7 weeks ago         456MB
rabbitmq            3.7.15              b3639fca0afd        10 months ago       149MB
mongo               3.2                 fb885d89ea5c        18 months ago       300MB
redis               3.2                 87856cc39862        19 months ago       76MB
kibana              6.4.0               a7e4cd1a7b45        21 months ago       667MB
elasticsearch       6.4.0               1ac676545731        21 months ago       791MB
nginx               1.10                0346349a1a64        3 years ago         182MB
  • 回答:
    • from+size:浅分页,数据量不大的时候效率较高,数据量大的时候该方法会把全部记录加载到内存中,可能会导致es内存空间不足
    • scroll深分页:(没详细了解过,事后查了下才知道)将所有符合条件的搜索结果缓存起来,可以看成快照,遍历时从快照中去数据

4.看你们用到了ELK,介绍一下它吧

  • 没详细了解过,大概说了下好处,做日志收集,logstash进行数据收集、解析,把数据发送给es,es进行日志搜索、Kibana可视化页面展示,当系统特别多,比如说有很多tomcat,有一台忽然出了错,你怎么快速定位是哪个服务器除了错呢?这时候使用ELK就能快速定位问题

5.Redis缓存雪崩、击穿处理?双写一致性问题解决?

回答:

  • 雪崩

    • 成因:缓存服务器宕机或者大量key同时到期,请求直接到达数据库导致

    • 解决:

      ①保证缓存服务器的高可用,集群或者哨兵模式,开启持久化

      ②本地缓存+Redis缓存+限流,保证数据库不会崩

      ③给每个key设置随机到期时间,避免大量key同时到期

  • 击穿

    • 成因:热点key失效,同时又大量并发请求过来,请求直接到达数据库层面

    • 解决:

      ①热点key的值不变,设置永不过期

      ②热点key的值变,但不频繁,使用分布式锁,获取锁的线程到达数据库,查询后将结果返回,写入缓存,没有获取锁的线程sleep随机秒,醒后重新从缓存中获取

      ③热点key的值变,且频繁,创建单独线程,在key即将过期前去请求数据库从新构建缓存

  • 双写一致性

    • 成因:数据库和缓存中的数据不一致
    • 解决:先清缓存,再写库
    • 引申问题:高并发场景下,这种方法会有什么问题吗?怎么解决?

6.RabbitMq相关问题

  • 你们项目中用的什么

    • 回答:RabbitMq
  • 怎么保证数据的可靠性传输

    • 回答:生产者开启confirm模式;MQ的交换器、队列、deliverModel设置成2(消息持久化)都开启持久化,MQ开启持久化后,搭配生产者的confirm模式,可以保证消息落地到磁盘后再给生产者反馈写入成功;消费者端将自动ack改成手动ack
  • confirm是生产者端还是消费者端

    • 回答:生产者端(没太明白问的什么意思)
  • confirm消息确认机制有没有什么问题,怎么解决

    • 回答:普通confirm存在性能问题,可以使用批量confirm和异步confirm
  • 异步confirm原理

    • 回答:(还好之间扫过一眼,大概记得)给Channel添加一个Listener监听器,监听器包含两个方法:handleAck、handleNack,每个Channel好像有一个集合,然后每发送一条消息,就往集合中添加,当调用handleAck时,从集合中删除一条或多条
  • 批量confirm有什么问题吗

    • 回答:一批中有一个nack,该批消息都会重新发送

7.锁的使用

  • 说说你们项目中什么场景下用到了锁,用的什么锁,锁的原理
    • (这个就结合自己的项目具体说明吧)xxx情况下,因为存在并发操作,为了避免xxx,使用了Synchronized锁,解决了xxx问题
    • 监视器锁基于monitor对象实现
  • 用没用过读写锁,什么原理
    • (大概说了下,读过源码,记得不是很清楚了)
  • 刚才说的AQS,能说说什么是AQS吗,它的实现原理是什么
    • 回答:三大元素—state状态值、currentThread当前获得锁的线程、Quenen阻塞队列。。。吧啦吧啦。。。口干舌燥
  • 刚才你还说到CAS,你们用的JDK1.8吧,你只到1.8中对它做了哪些优化吗
    *

8.分布式锁的使用

  • 说说你们项目中哪个场景下用了分布式锁,怎么实现的
    • 回答:(这个就结合自己项目介绍一下吧)xxx场景下,基于数据库实现了分布式锁、Redis分布式锁、zk分布式锁

9.分布式事务

  • 分布式事务用过吧,说一下你们怎么用的
    • (具体问题具体分析吧,结合项目说一下流程。。。)

10.数据库部分

  • 你平时都是怎么对数据库进行优化的

    • 回答:五个方面吧。缓存;sql语句自身的优化;数据库表结构的优化;索引;分库分表;然后吧啦吧啦,详细展开介绍一下各个环节具体怎么操作
  • 刚才说到执行计划,执行计划中type有哪些内容

    • all、index、range、ref、eq-ref、const、system
  • 你们超过多长时间的sql看成是慢sql
    *

  • 说一下索引吧,用索引一定快吗?说说索引失效的场景,聚簇索引和非聚簇索引检索过程有什么不同
    *

11.你们怎么做的系统拆分?

  • 没回答好。。。

12.设计模式部分

  • 你们项目中什么场景用了什么设计模式,解决了什么问题
    • 回答:spring中用到的单例模式、原型模式,其他还有工厂模式、代理模式、适配器模式、装饰器模式(本来想引导面试官问我最简单的单例模式呢。。。结果问的原型模式)
    • 大概有个案例,记得是当时有个第三方接口需要对接,对接两边参数不一致,而且两边接口都在不止一个系统中使用,为了不改变接口实现对接用到了适配器模式,完成适配对接工作
  • 说一下原型模式
    • 回答:spring中把scope设置成prototype,可创建多个不同的对象,使用到了原型模式;然后说了一下浅拷贝、深拷贝

13.用没用过Servlet

  • 一脸懵懂,平时常用到HttpRequestServlet,单介绍Servlet还真不知道它到底是个什么东西

14.看没看过Mybatis源码,简单介绍一下工作流程

  • 很早前捋过源码,现在只还有个大概印象,简单介绍了下

15.说一下springAOP原理,你还知道其他非侵入性编程的实现方法吗

  • 动态代理,JDK、CGLib,具体就不写了,网上一搜一大把
  • 第二个问题问的。。。真的是毫无头绪,只想到了AspectJ,在springAop中用到了,这个真没研究过,回答说不知道,然后那个委员会的大佬给科普了一下,虚心受教,表示回去后学习了解一下,中间能跟面试官有些好的提问互动就更好了,我觉得吧,有些问题没回答上来也不要慌,这时候就要重点表现出你有一颗学习上进的心,这一点很重要的!

16.你有什么想问我的吗

  • 大概问了下项目中使用到的技术栈、如果进公司的话大概负责哪方面的工作,有没有定期的技术分享或培训之类的

你可能感兴趣的:(2020-5 某游戏公司面试过程)