敖丙:春招字节跳动、蘑菇街四轮面试,分别问了啥?

前言

这又是一期读者的面经分享,很巧的是,他在蘑菇街面了三轮,最后虽然没过,可是也但愿分享出来你们瞅瞅。面试

我这周可能会单独作个大厂面试流程的视频,涉及每一轮的考察点注意事项,若是以为有必要,能够留言让我知道大家想看啥。数据库

面试经历

一. 11.20 字节跳动一面Java开发,直接挂(耻辱开头……)

  1. 介绍主要项目,怎么作的;
    • 原本想简要介绍作的业务,但面试官要求详细介绍,因此二十分钟都在介绍业务;
    • 送命问题:数据量多少?说了实话,实际使用单表1000—10000级别。致使后面基本上面试官根本不想问问题了……
  2. 对 Spring 的理解?
  3. 对 AOP 的理解?
  4. 讲一下 Java 的静态代理和动态代理
    而后就没了,进入问问题环节…… 固然知道已经凉了。面试官说的问题主要在于,在研究所的技术栈仍是太落后,说互联网的思路和咱们这种人不同。在提了并无什么实际性的建议以后,结束面试。

收获:缓存

  1. 第一次面试,终于踏出了这一步;
  2. 认识到了本身与一线大互联网公司的差距,待继续努力;
  3. 因为面试时的准备方向错误,在数据量方面的成果无意之失直接判了死刑,并无表达出来真正的性能和准备的内容。之后准备,必定要向大数据量、优化等方向考虑!
  4. 表达能力太差。【对…… 的理解?】这种问题一抛出来,尝试用浅显易懂的方式

二. 12.04 蘑菇街一面高级 Java 开发

  1. 介绍主要项目(大概二十五分钟左右);服务器

    • 通过上一次失败,此次梳理了业务的主线,比较熟练的介绍了业务,依旧花了十五分钟,不过中间穿插了询问项目方面的问题;
    • 询问问题:
    • (1) 动态模板的数据源从哪儿来?答:资源目录注册,经过各个数据服务获取;
    • (2) 增量数据比较多的状况下,数据源怎么处理?答:一方面,数据源一般都是数量比较固定的内容,由各个业务来封装处理,对于增量数据比较多的状况,使用动态模板的关联表模式;另外一方面,数据源数据比较多的时候,一般会使用树状结构,数据服务有通用的懒加载处理方式,不会出现性能瓶颈;
    • (3) 动态模板怎么作数据的逻辑处理?答:动态模板只负责数据的记录,关于逻辑处理是另一个业务,在简历中也有介绍。而后介绍了动态汇总的设计逻辑,大概十分钟。(说明面试官对作的项目有兴趣,而且个人回答已经有了引导性)
    • (4) 若是逻辑处理过程当中并无抛出技术性的异常,而是计算错误的异常(相似于 1+1,结果算出来是 3 的错误),有没有什么处理?(问的是有没有计算监控功能)答:没有,只是较为严密的关注了技术上的异常,计算上的错误没有处理。若是真的处理了这种问题,须要经过运维人员在配置页面中清除 Redis 缓存。
  2. 线程池基础
    • 对于一个普通的线程池,coreSize = 5, maxSize = 10,阻塞队列长度 20,且插入线程是永久执行的,那么不断插入线程,线程池中的数量以及对应的反应如何?答:该问题只需了解线程池的运做原理便可回答。
  3. Spring AOP网络

    • 类内部调用 AOP 问题:a() 方法被 @Around 注解用来输出日志,b() 方法没有 AOP 注解,但 b() 方法内部调用 a() 方法,那么调用 b() 方法会有怎么样的输出?答:不会有日志输出。由于这是类内部调用,而 AOP 是经过代理进行的,类内部调用不会调用代理类,不走代理因此不会有日志输出。若是想要有日志输出,须要在该类中经过 AopProxy 将代理对象(命名为 proxy)获取,而后在 b() 方法中经过 proxy 调用 a() 方法;
  4. 为何临时决定找工做?答:由于比较熟悉这里的工做,想找挑战。架构

  5. 向面试官提问问题。问了问业务内容,技术栈。

三. 12.13 蘑菇街二面高级 Java 开发

总体就是介绍主要项目,时间总共四十分钟左右。并发

  1. 动态模板
    • 动态模板的主线流程已经比较熟练了,该方面流程介绍没有什么问题。
    • 询问问题:
    • (1) 动态模板的数据源从哪儿来?答:资源目录注册,经过各个数据服务获取;
    • (2) 动态模板里面的数据怎么来?答:用户添加了模板以后,往里面录入数据;
  2. 有堆 Dump 和数据库链接池优化经验,怎么作的?负载均衡

  3. 动态汇总统计
  • 这次面试的绝对雷区。在叙述该部分的时候,我说明了该项目是我设计的。但在描述项目的设计理念时,并无像上次同样描述的很清楚,反而描述卡顿,中间一度难以进行下去。该部分的设计必定要造成稿子,而且熟练表达,不然拔苗助长。
    1. 简历中写了统计的效率优化,具体是怎么作的呢?
  • 两个出发点进行优化。框架

  • 第一是粒度,咱们有的汇总结果是须要统计多个表的。本来在实现的时候,因为要求赶时间上线,又有性能要求,因此当时同事写的时候,在增删改数据时,咱们的数据服务触发了订阅,通知集群中全部服务数据更新的事件,全部服务又分别发起了五个表的查询请求,对查询结果进行处理后存入缓存。

也就是说,改一次数据,会致使一个服务的五次查询,若是集群里有十个服务,那么改一次数据就会触发五十次查询。可是从业务的角度来看,改了一个表的数据只须要清除该表的缓存便可,其余四个表的缓存并不须要修改,也就是粒度太粗,因此我第一步是将粒度细化到表的级别。运维

  • 第二是历史数据。由于咱们的业务场景是容许查询时间段内的信息,而业务场景又有限制:今天以前的历史数据是不能修改的。也就是说咱们能够把历史数据做为长时间缓存,今天及其之后的数据做为短时间缓存,修改数据只触发短时间缓存的更新。
  1. 简历上写了使用 ZK 的分布式锁,为何要选用这种实现方式?使用场景是怎么样的?
  • 业界分布式锁一般状况下是用 Redis 的 setnx 来实现的,但当时咱们的 Redis 尚未搭建起来,缓存用的是 Memcache;此外,咱们的注册中心基础是 ZK,而 ZK 的瞬时顺序节点是能够实现分布式锁的功能,因此我就使用了。

  • 使用场景:咱们的汇总比较麻烦一些,因此进行一次汇总时间相对较长。虽然一般汇总结果都会放到缓存里,但若是某一时间缓存中没有数据,又有大量并发进行汇总结果的查询,那么就会引起穿透。因此一方面我和同事搭建了布隆过滤器,防止缓存穿透的情景。

另外一方面,大量并发同时查询汇总结果时,因为服务作了负载均衡,因此集群中的服务都会接收到请求,缓存中没有汇总结果,会全部大量服务进行计算。但其实只须要一个服务进行缓存的计算便可,其余服务的计算属于资源浪费行为。
因此我对一个须要进行汇总的业务使用了分布式锁,用查询条件做为锁,获取到该锁的服务进行计算,并负责将计算结果置入缓存,
其余服务在尝试获取该锁的时候失败,返回一个默认的结果,这样便避免了多余的计算。

  1. 有什么须要问面试官的问题?问了问业务内容,技术栈。

    四. 12.20 蘑菇街三面高级 Java 开发(失败)

共 40 分钟左右;

  1. 自我介绍

  2. 简历上写有 JVM 优化经历,怎么作的?

  3. 若是设计一个自动监控系统,如何设计?如何实现?
  • 因为在刚才的 JVM 优化过程,目的是监测某个压测问题,我介绍了一个经过 JVM 检查问题缘由的流程。因此面试官提出了该问题。
  • 关于自动监控系统的设计,我了解有 ES, Logstash, Kibana 的开源套件,有用于日志收集和监控,但具体我没有过多了解;
  • 若是是基于咱们的系统进行实现的话,应该会基于咱们的注册中心开发一个新的新的监控服务。咱们的注册中心以 WAR 包的粒度,将对应服务注册到 ZK 集群上。因此新的监控服务设计的基本思想,应该是对全部注册到 ZK 上的服务发送心跳包,收集各服务所在服务器的系统指标、服务运行相关信息;
  • 面试官追问:监控哪些服务器和服务的哪些指标?怎么监控?
  • 答:服务器指标应该监控服务器的 CPU 占用率、内存使用量、网络各状态的链接数、网络带宽;服务的指标应该监控 Heap 堆的容量、单位时间内 GC 次数、各状态线程数量;
  • 具体监控的方法我认为 Java 中应该给出了 API 接口能够获取这些信息,由于以前我以前作的的业务操做日志记录系统中,有 IP 信息的获取记录;当时就是调的 Java 的 API,因此我感受应该有类似的调用方法;
    1. 索引如何设计?
  • 是因为我说咱们目前业务的日志操做监控系统是把数据存到了数据库中,因此提到了该问题。
  • 个人回答:
  • 咱们构建索引时主要针对几种状况:
  • 对查询使用较多的字段考虑构建索引;
  • 可能会比较多使用到筛选、排序的字段;如比较经常使用的时间类型;
  • 有下拉树惟一标识性质的 ID 字段;
    1. ZK 怎么用的?选举机制?
  • 提到 ZK 是由于我提到咱们的服务注册到了注册中心上,注册中心是用 ZK 为基础的;
  • 个人项目中接触到 ZK,主要是我在服务集群计算的时候为了节省计算资源,因此使用 ZK 做分布式锁;此外 ZK 也用来咱们注册中心的注册;
    1. 互联网的架构了解哪些?
  • 回答了秒杀系统,具体有点忘了。(能够看看丙丙的历史文章,秒杀是个人爆文)
    1. Spring 的思想?代理如何实现?
  • Spring 的思想主要是按照以前写的博文进行描述的
    1. 为何选择使用 SSM 框架?为何使用 Spring boot?
  • 使用 SSM 框架的缘由主要是这是整个业界比较通用的框架,并且也是部门的通用框架;
  • 使用 Spring Boot 的缘由是,Spring 和 Spring MVC 有不少配置文件,比较繁琐,而 Spring Boot 将不少配置给集成了进来,使用基于注解的配置方式比较简单方便。
    1. 了解的互联网经常使用的技术栈还有哪些?
  • 除了简历上写的,还提到了 Nginx 用于反向代理和负载均衡;若是到达了 Nginx 的反向代理极限,可使用 F5, LVS 进一步扩充并发量的支持,但咱们的并发量没有到达这种程度,因此没有再向上了解。
    1. 秒杀系统中,缓存与数据库的一致性如何保证?库存,网络波动。

絮叨

能够看出每一面都不容易哈,你们真的要好好学习呀。

Tips:我有个读者已经面进咱们公司作个人同事了,丙丙还和他约了一楼咖啡厅喝茶,到时候也会分享出来。
敖丙:春招字节跳动、蘑菇街四轮面试,分别问了啥?

相关文章
相关标签/搜索