京东一面面经
之前公司的一个小师弟,想换工作,就投递了这家公司,总体来说面试难度不高。
我这个小师弟背景: 985本硕毕业,美团实习一年,在一线大厂工作了2年,目前薪资32K*15。这家公司的薪资还是可以的,工作2年,年薪50W~100W,并且是非常核心的部门,面试时长60分钟。
面试结果:3轮技术面,一轮HR面全部通过。 二面,三面会邀如下:
如果觉得文字太枯燥,可以去dy查看视频: dy搜索: Java西瓜。
首先是和hr沟通:
先自我介绍,hr问了一些基本信息,然后问了一下为什么离职、绩效、对加班的看法等。 时长6分钟。
总结:
hr问你为什么离职:积极乐观一些,比如:愿意接受挑战,做更核心流量更高的业务。
对于加班:千万不要说不愿意加班。 互联网公司的加班情况,没网上说的那么夸张,除了极个别的业务加班夸张外,大多数公司和部门也都能接受。你说不愿意加班,那面试基本结束了。
技术面试环节:
面试官第一个问题: 你在某某公司也几乎2年,你觉得在这2年经历中,你觉得最大的技术挑战和技术亮点是什么?
候选人回答:
刚开始从学校入职职场的时候,入职某某电商部门,做的是营销和排行榜业务,这些业务的流量都是比较高的。 我在课本学到的知识或者我在博客中学到的知识,发现运用不到实际工作中,学习是学习,真正的企业级开发和我之前学到的知识还不一样。
首先做项目,看看别人是如何处理高并发的场景的。 虽然之前没有做过这种业务,但是对于MySQL、Redis、本地缓存等底层还是有所了解的,因为自己的基础可以,能快速的学会系统是如何应对高流量的。
通过自己的学习,不断的积累,看别人是怎么做需求的,然后看我们做项目遇到问题时,高职级的同学是怎么解决的,慢慢的去学习和模仿他们。
候选人回答的有偏差,他以为面试官在问他如何学习,如何成长的,这也算一个挑战。 但是一般情况,面试官肯定问的是项目有哪些挑战?而你是怎么解决的。 后面面试官又重复了这个问题,候选人get到了面试官的点。
候选人回答:
好的,那我说一下具体的业务吧。业务背景是商家排行榜,这个需求主要是让商家和达人(粉丝量超过1000的就叫达人)能够看到卖货排行榜数据,排行榜数据是每天中午12点刷新,刷新的昨天的数据,每个维度下面展示前100名的商家卖货排行榜数据。
我这里主要做的工作就是:
首先是职责划分问题,对于大数据量的商家的排行榜数据统计和计算,后端是没有办法做的,所以商家排行榜数据统计是数仓来做的,计算完成数据后,我调取他的接口查询其统计出来的商家排行榜数据。
第一个问题是: 数仓如果统计不出来数据,我这里怎么兜底。 如果不兜底,排行榜数据每天12点要刷新,数仓数据没有计算完成,用户会看到空白页。
第二个问题是: 怎么样保证数据的一致性。 因为后端从数仓读取数据的时候,从开始更新到最后更新完成Redis缓存的数据,有时间差。 这个时间差会有数据不一致的问题。
第三个问题是:因为底层计算完成的商家排行榜数据不在我们这里,如果运营觉得商家排行榜数据计算的有问题时,我们应该如何快速定位问题。
面试官第二个问题: 因为是数仓推送的数据,所以数据不是实时变更。 候选人回答:是的。
面试官继续问:数仓推送来的数据你们是直接更新Redis,还是会做持久化的存储?
候选人回答: 我们这里是不需要存储的,因为数仓计算完成数据后,定时任务轮训调取他们的接口获取数据,直接放到Redis中就行。
面试官问: 你们是定时任务轮训,查的是吧。
候选人回答:是的,我们存储这个数据也没有意义,因为我们根本就不请求MySQL,这个流量不可能让MySQL来承担的。
面试官问: 你们请求的是数仓的RPC吗?
候选人回答:也可以认为是一个RPC,和数仓交互一般有2种形式。 1是发MQ,2是给我们提供接口。 因为种种原因,交互形式是数仓提供接口,我们去查询就行。
面试官问: 现在主要是一个数据拉取的过程,候选人回答: 是的。 面试官继续问,那么现在就有一个很敏感的点,约定的是12点,数据更新,数据轮训的过程中,你不能保证拉取的是最新的数据,或者说如何保证拉取的是最新的数据?
候选人回答:是这样的,数据肯定是有时间维度,今天不是更新的昨天排行榜数据嘛,数仓在写数据的时候肯定会写时间参数,他提供接口是,你拉取某个时间点统计出来的数据,是这样交互的形式。
面试官问:你拉取数据的时候,是有一个时间条件的。 候选人回答:是的。我们今天查询昨天的。
面试官问: 你刚刚也说,在12点的时候,缓存数据是失效的。在他缓存失效的这一刻,流量比较大的话,你这边的逻辑是怎么处理的?
候选人回答: 我们这里12点并不会让缓存失效。因为怕数据出问题(数仓跑不出来数据),缓存的过期时间不能设置成1天的,因为缓存数据失效,这个流量要么打到数据库层,要么打到数仓嘛,这肯定是不行的。我们的解决方案是,缓存数据的过期时间肯定是足够长的,我们这里的解决翻案方案是多数据备份,一方面数仓跑不出来数据,我们可以返回兜底数据,另一方面我们要排查问题,也需要多数据备份。
面试官:那么现在就有如下问题,1是缓存的过期时间是什么? 2.缓存的key如何设计,就像你说的,能找到对应的数据。
首先我先说一下,Redis缓存这个key的设计。这个key我可以保存一份数据,也不分时间点,用户过来查商家查询排行榜数据时,就查询这个数据,但是这样有一些缺点,比如说:数据不一致问题,如果你只有一份数据,那么定时任务在更新的时候,Redis必然有2种数据,一种是已更新完成的数据,一种是未更新完成的数据,这样会出现数据不一致的问题。第二个点就是老的数据覆盖掉了,那么数据就找不到了,没有办法再去定位问题了。
我们采用的是数据备份的形式,这个key肯定是要和时间关联,value是指定时间点,数仓计算出来的排行榜数据。
接下来需要考虑的是,使用Redis的哪种数据结构保存数据,我们使用的是String的数据结构,这样可以将流量打散,但是List等数据结构,保存的数据越多,这个数据结构的职责越多,需要承担的流量更高,容易出现热key,bigkey问题。 所以我们一般都是把数据打散来设计的。
接下来过期时间,Redis有这样的机制,比如1天,如果你不重新设置过期时间,缓存时间到了,从Redis查询不出数据。缓存数据过期时间到了,Redis里面有可能还有该数据,但是后面一定会异步清除。
面试官: 所以你的过期时间设置的是多长。
候选人:7天。因为7天方便定位问题,也足够兜底了。
面试官: 也就是7天内,你有6份备份,一份数据,对吗?
候选人: 是的。
面试官:有点类似于游标,我应该指定到哪个时间查询? 这个查询时间是怎么确定?
候选人:我们使用的是版本号。定时任务不是在刷新缓存数据嘛,刷新完成数据后,向Redis中插入数据更新的时间点,在查询数据的时候,确定一下版本号,然后实现不同数据的查询。
面试官: 我们现在也遇到了和你差不多的一个问题。 数仓现在推的数据有问题,导致今天的数据都是脏数据,怎么样动态的切换这个查询时间?
候选人回答: 缓存脏了,你想把缓存的数据更新了。 可以把这个游标(查询时间),放到动态配置中心里面。
面试官: 方案没问题,确实是这么做的。 你们的项目没有这么做,对吗?
候选人回答: 我做的这个活动没有。 但是我有看过我同事的代码,他之前在阿里,也是做活动,他会考虑缓存数据脏了的问题,怎么清除缓存数据的问题。 但是我们这个是排行榜数据,数据没有这么敏感,因此就没有考虑。
面试官; 刚刚你在提到Redis的时候,有提到分流,也提到了热key,咱们这块是怎么样处理热key问题的?
候选人回答: 我们这里的热key解决方案,就是本地缓存。当流量比较高时,我们是本地缓存+Redis。加下来是Redis的数据怎么样刷新,一般是定时任务。
面试官: 那本地缓存是怎么样刷新的?
候选人回答: 我现在所在的公司也封装了一个本地缓存,其底层的设计思想都是Guava的LocalCache,首先是有过期时间,如果过期时间到了后,他有load机制,告诉LocalCache从哪里获取数据,但是load时不要读写数据库,从Redis获取数据就行.
面试官:本地缓存和实际数据可能有一定时间的不一致,是吗?
候选人: 是的。流量高使用缓存后,不会追求强一致性。 因为我们这里有缓存,上游也有缓存。如果追求强一致性,只能拿数据库来扛了,比如订单。
面试官: 是的,没问题。
面试官: 咱们现在整个防刷限流机制是什么?
候选人: 防刷限流是什么? 限流吗?
面试官回答:是的。
候选人: 我在公司期间,换了2个leader。 第一个leader让我们使用RateLimit,单机限流,但是RateLimit限流大小配置到了动态配置中心中,可以实时的更新每秒有多少QPS。换了一个leader后,使用公司的限流组件,这个是集群限流, 我懂这2个。
面试官: 这2种限流各有优缺点。 你可以说一下,这2种限流适用于什么场景吗?
候选人回答:第一种限流RateLimit,这个是单机限流,如果你们服务器配置不一样,这种限流可以根据自己的服务器配置来配置你的单机限流大小。
服务器限流: 就是整个服务器集群抗的流量。
面试官: 这没问题,这2个限流的场景是什么?
候选人回答: 这个我可能回答不好。
面试官: 集群限流是在压测,你可以测试整个集群能抗多少流量,其限流指标是不变的。你可以通过扩容或者缩容来改变集群能抗的流量,一台机器是10,比如10台服务器,那就是100,和我的预期不符,那么我就扩容,限流指标可以动态变化。
扩展: 我这里大概明白面试官说的意思了,面试官的意思是因为现在很多公司都有动态扩容,你只需要配置集群容量,如果流量高时,其会动态扩容,流量低时,会缩容。
单机限流是每台服务器能抗的最高流量,这样可以保护每台服务器不被打挂。
后面又问了其他项目是怎么实现的,就不整理了,项目参考意义不大。
总结:
本场面试,候选人回答的还是很好的。 不用过多解释,候选人就知道面试官想问什么,并且也给出了自己项目是如何解决的。
现在的一线互联网公司很少有直接问八股文的,都是围绕着候选人的项目来问,如果你想进大厂,至少需要准备2个能和面试官聊得项目,而且里面一定要有难点和你的思考点。
还有就是不要直接背八股文,没什么意义的。 你背的很多八股文,大公司根本就不会用这些技术去解决问题。多去了解企业级的解决方案。
#我的失利项目复盘##java##简历中的项目经历要怎么写##面经#