今天带来我的好友健哥面试拼多多海外电商Java岗的一个复盘
前言
大家好,我是健哥。今天跟大家复盘一下自己面试拼多多的一个情况。我投的是拼多多的海外电商部门Java岗,大家其实也知道现在这个互联网的大环境不太好,拼多多算是HC比较多的,现在还在大规模招人的一家公司。海外电商可以说是整个拼多多未来的一个经济增长点或者说是整个拼多多最看好的或者说寄厚望的一个业务。
拼多多的面试主要是两轮技术面加上一轮HR面。 技术面的第一轮是你的小组长,第二轮是你总监,并且拼多多技术面是要手撕代码的。而且他们是有自己的代码平台,你需要在这个平台上去写代码。
两轮技术面都有一道代码题,我的第一轮面试官主要还是围绕基础知识展开,项目其实聊的并不多。一面重点全部都围绕在了数据库上,聊得很多,也很集中。基本都是mysql和redis,我不知道是这个面试官特别擅长数据库还是特别喜欢数据库,我感觉他特别爱问这个,就集中火力的问,非常可怕。
一面
1.索引
第一部分是索引,像innodb存储引擎,聚簇索引和非聚簇索引。像innodb是必然有一个聚簇索引,先问一下它的聚簇索引是怎么构建的,然后非聚簇索引和聚簇索引有什么区别。
接下来就问回表,索引覆盖,联合索引的最左前缀匹配规则,就是连着问,紧挨着问你。而且还不是那种面经,不是你只说出这个面经的这些话就行了,他还会给你一个联合索引,然后给你很多个SQL,请问这个SQL哪些查询条件命中了这个索引。
然后接下来又问了一下索引的这个设计原则,就是我们在设计这个索引的时候要注意什么东西,然后设计高效的索引你有哪些原则要去遵守。
2.mysql事务
第二部分主要mysql的事务。首先逃不了的就是事务的四大特性。a c i d(一致性、隔离性、持久性和原子性) ,然后又问了这四大特性它是靠什么来保证的。像隔离性是用锁机制来保证,持久性通过redo日志来保证,一致性和原子性是通过undo日志来保证的。
接下来又深入问了redo日志和undo日志的区别,它的一些实现原理,具体怎么工作的,就是具体怎么保证这个四大特性的实现。
3.数据库并发
然后第三部分是数据库的并发。并发也绕不开那个点,就是四大隔离级别, 首先你要把四大隔离级别讲清楚。什么情况下会并发,读读是不可能有并发问题;读写,写写它都会存在并发冲突的。
聊完这个之后又问你mvcc,innodb它是怎么解决幻读的;mvcc的实现原理是什么;接下来又问悲观锁和乐观锁,什么情况下该用悲观锁,什么情况下该用乐观锁。
mysql就主要问这些,问了很久,确实问了很久。就是不停地问,最后我都答得不耐烦了,然后问完mysql之后他就开始问缓存了,就redis。
4.redis缓存
缓存问的没有那么多,就是主要聊了一下缓存穿透,缓存击穿,这两个的区别。它怎么解决,它解决方案是啥。然后再聊了一下redis的两种持久化机制,aof和rdb。就是一个是快照,一个是日志。
然后也细问了一下aof的这个工作原理和工作流程,这个问得还挺深的。最后一个问题就是缓存和数据库的一致性,你怎么保证。这个问题我回答的时间很长,因为它的方案有很多,比如:先删除后修改或者先修改后删除。
虽然有多种方案,但是最好要把这些方案的优缺点,可能会出现的问题,怎么去规避这个问题,尽可能的答出来,我感觉应该就差不多了,其实我一面整体的问题上应该都答出来了,感觉面试官还挺满意的。
5.算法题****
一面的最后就是写了一道算法题,我的那道算法题是一道螺旋矩阵。大家其实可以去看一下有个网站叫CodeTop,拼多多的最高频的算法题就是螺旋矩阵,我正好就问到了,我当时刷CodeTop的时候正好刷过,所以我写得很快,最后一个小时多一点点的时间就结束了这个第一轮面试。
二面
1.聊项目
二面的话其实就不问这些八股了,重点全部围绕到了你的项目。我的项目其实蛮多的,但是感觉面试官就只看中了我一个技术点,就那个技术点聊了半个小时。
因为我那个项目中有一个数据库到elastic search的一个数据同步技术方案,就是我自己设计了一个技术方案,因为数据库的查询能力是有限的,然后很多表之间的join查询是很慢的,所以一般我们在工业界都会选择大宽表。就是把几张表建一张大宽表,就join在一起建一张大宽表,然后放到一个elastic search上面去,然后我们如果要去查这些复杂的查询或者一些详情的查询,本来是需要mysql表与表之间做join,但是现在你不需要了,你直接走elastic search去查这个大宽表就行了。因为elastic search它支持海量查询,所以它查询速度很快,所以一般工业界就是这么做的。
2.如何保证数据同步
但是这就有个问题了,数据库和elastic search这个数据同步怎么保证,我当时是采用Binlog的那个方式去做的,我还跟面试官讲了一下数据同步就是mysql到elastic search的这个数据同步有哪些方案我都给他列举了一下。最后我选择了Binlog监听,通过卡夫卡消费的方式去解决了这个数据同步的问题。为什么选择这个方案,主要是它逻辑的耦合度比较低,就是它这个代码是不耦合的,你只是监听那个Binlog就完全解耦了。
3.数据实时性
讲完了这个之后,面试官又问了我很多实现细节上的一些问题,比如说你数据同步的这个过程中,你如何保证这个实时性。因为我这个项目不是强一致性,是最终一致性,所以我对这个时效性要求没有那么严格,就一两秒都是可以容忍的。
如果要严格保证,那么同步方法就只能双写。通过事务把它给绑在一起双写,但是这种代码的耦合度太高了,相当于只要有个地方修改了这个数据,那你也得去用代码去修改那个elastic search的数据。所以绑在一起耦合度太高了,后期的代码的维护也不太方便。
4.算法题
第二面的最后也是算法题,其实也比较简单,是一个二叉树的宽度,就是输入一棵二叉树,求这个二叉树的宽度,这个其实是leetcode的一道经典题了。我感觉大厂的算法题也不会太难,一般都是中等题,我到现在遇到的主要还是中等题居多。
以上就是整个拼多多的一个面试复盘。