同程旅行一二面
🕐面试时间:2025.12.03
🏢部门:酒旅广告
一面
说一下你这个是怎么用乐观锁做投流拉黑的?介绍一下你们的业务,为什么要拉黑投流单,同时哪里出现了你描述的并发冲突
你有考虑这个反过来的情况吗?你这个相当于就是你的 job 把那个运营的操作给覆盖了,那反过来呢?
这个本地缓存热更新是指什么?更新的是什么内容?怎么实现的?介绍一下你如何实现更新特定的缓存的
这个令牌桶限流是指什么?
那使用那个 Redis 进行限流,还有别的方案进行限流吗?为什么你们否定了本地令牌桶限流的方案,你说一下你理解的什么时候用本地令牌桶什么时候用分布式令牌桶
你这个对象池是优化什么场景的?里面存的是什么数据?为什么你们选择使用了这个东西,有什么样的考量吗?
这个对象池自动扩容,动态扩容兜底是怎么做的?你是怎么在代码层面实现池资源不足的时候保证对象100%分配的,我了解到这个对象里面的信息还挺重要的
你们的请求是如何落库的,我看到你这是落库到Doris,对于落库你们是怎么处理的?单次落库还是批处理落库?如果是批处理的话一批的量级限制是多少呢?
你们的请求是如何落库的,我看到你这是落库到Doris,对于落库你们是怎么处理的?单次落库还是批处理落库?如果是批处理的话一批的量级限制是多少呢?
介绍一下优雅停机
说一下Mysql的三种日志文件
一条更新SQL的执行过程
那个平常有遇到过 OOM 或者说 CPU 升高的问题吗?选一个你遇到的问题说一下
你介绍完你说的OOM问题了,你说一下这次问题你是怎么排查的?你有了解到常见的排查OOM的方案是怎么样的吗?
你知道Heap Dump文件并不是默认就Dump的吗?
你知道这个会有个JVM参数去控制吗?说一下这个JVM参数是什么
那 CPU 升高呢?有排查过吗?说一下你遇到的问题和排查思路
二面
聊天-工作选择,实习选择
大数据这一块你有去了解过吗?
我们说一些并发的场景,例如你这个场景是一天个几亿的那个就点击量嘛,嗯,如果想要分析目前你现在接触到的一些那个技术,你能想到的是什么方案?选用什么样的大数据去处理这种大流量的请求呢?
就是你这边是原来做日志采集,然后Hive离线的吗?对于在线任务和离线任务这种那我们可稍微聊深一点,你怎么理解大数据这种东西的?比如那个你刚才 Doris, 还有Clickhouse以及Hive, 这些数据库它的这个存储相比于关系型数据,为什么它能处理大批量的数据?
我想问你知道从存储结构上来说传统数据库和大数据数据库,你知道他们的存储结构是怎么样的吗?例如Mysql是列存储,那么大数据数据库的存是怎么样的呢?
Mysql的事务是如何保证的
那你对 MySQL 里面比如这个索引对吧,你比如给你一张表让你去加索引,你这个评估的依据是什么?
mysql索引考量的细节,我为什么要在这一列加索引?这列能不能加索引?你有过这方面的对吧?你给个你的想法,就比如为什么我要选这一列?
那我给你一个数据的场景,例如我们的数据有个标识字段,例如tag吧,这个tag只有0和1两种类型的数据,你觉得这个索引有意义吗?你觉得这个索引带来的效果会很显著吗?
这个的话面试官说了个新的考量点,也就是【散列值】,他说不同人对mysql的理解不同,书本里面的看法或者博客里面的看法其实本质上都是个人看法,但是最好看专业的书,里面有些人的说的点很好,那就是散列值。例如一个数据是否删除的字段是delete,它只有0和1这两个标识,假设1000w数据平分,它也只是定位到了500w逻辑删除的数据和500w逻辑存在的数据,没有更加细致的定位,也就是数据分散的区间,也就是两种。所以这个索引的意义并不大,对于列的考量在于散列值的分散程度,例如一个tag字段有20个标识,1-20,然后这里还是1000w数据然后平分,那么每个数据就是50w份。然后通过这个tag,可以在这个1000w数据中定位到更精细的量更少的数据,也就是50w,这种散列度是20,如果是刚刚那种delete的情况,散列度是2,也就是500w数据,他们的查询性能以及查询数据的区间划分没有散列度高字段那么细致,所以散列度低的字段,就算加了索引也没有什么用,散列度高的字段加了索引能带了很大的性能提升。他说很多人都局限在业务层的sql层,也就是这个字段在业务中是否用的频繁,但是这只是业务层的东西,真正底层中对于列是否加索引的考量应该最重要的是这个列的散列值
Redis的数据结构,介绍一下在企业中Zset和List是用来做什么操作的
介绍一下令牌桶的底层原理?它是如何发放令牌的?
你说令牌桶的底层用了lua脚本保证原子性,说一下它内部的哪些操作是要用lua脚本保证原子性的,没有用lua脚本保证原子性会有什么问题?
既然你说到了Redis限流,那我要让你在本地用java做一个限流器,然后我要求用加法来实现统计,你会选用什么样的数据结构呢?
你这种累加的话有个缺陷,虽然你可以实现统计,但是是全局统计,但是我要的是1s限制10次请求,你该怎么重置你数据结构的请求?你的重置操作是什么?
但是比如说一秒过了,你怎么知道他一秒过了呢?这种东西必须是有个标识的,你改一下你结构的key-value设计让这个结构更加合理,这个存储结构的字段你该怎么考量?
你说一下你是如何在业务代码中进行SQL优化的?原来代码有什么问题,你改了什么样的逻辑,这个问题是怎么发现的?
我要你介绍一下实际生产中你是如何将代码层面的优雅停机和K8S那边的停机结合起来的?这应该会有个处理适应和优先级
我看你接触过微服务,也就是说SpringCloud这一块,你对微服务的理解是什么呢?微服务间不用域名访问而是中转调用,这个好处是什么呢?你能说一下你理解的微服务的优势和劣势吗?
这个的话是面试官的陷阱题,是考对微服务的理解是否出问题,我说的是SpringCloud生态衍生出的SpringCloudAlibaba生态,以及有些生态是用Consul+Apollo,没有掉进面试官的陷阱,他说很多初学者背概念没理解,把微服务理解成SpringCloudAlibaba是错误的,这个面试官说我理解对了,没有掉进他的陷阱里面
说一下你做的这个分布式ID发号器是怎么解决时钟回拨的
好,这个时钟回拨我有个疑问,这是生产真实发生的问题,假设我把这个时间给你往前调了一分钟,你该如何知道我这个时间被调了?
这个的话参考美团的Leaf处理方案,如果是时钟回拨问题,会有个中心化的一个时钟,还会有个本地缓存记录上次操作的最新时间,然后本地缓存和远程时钟进行同步之类的思路
你的修正逻辑没有问题,但是不能解决根本问题,例如你这个问题频繁出现,是不是要出现频繁的修正,你出现了频繁的修正就会导致整个系统的性能全部下降
面试官说代码方面的问题是没问题,这个逻辑是能解决,但是并不是实战中的真正解决方案,因为就算代码解决了回拨,但是追上回拨还是会有性能方面的问题,如果频繁出现的话那个服务的高可用就不存在了,性能还会被影响,所以时钟回拨的最终解决方案的最重要的一步,不是解决回拨,不要去解决回拨,而是说去监控和通知,不同的回拨场景的方案也会不同,例如有些场景可能是修改一下或者扩容一下就能解决了,所以通知是最重要的,不要想着在代码层面解决时钟回拨
你写到了日志采集,你说一下这个日志采集的详细流程,这个采集是怎么将数据转换成可用的格式的?然后采集后该怎么进行发送上报?
我们不问AQS,Future那种基础层面的概念,这种是最基本的,那就问你一些并发相关的东西吧。我们有多个接口,要把这多个并发查询再同时出结果,这种你是怎么处理的?
我说的是公司内部的编排框架,企业里面其实有一些编排框架的,也就是编排工具类,用CompletableFuture的allof把结果组合,或者说用CountDownLatch拦截然后把代码组合
你说到了CountDownLatch,你知道这个也弄用CycleBarrier实现吗?你有了解这个栅栏的并发实战场景吗?你介绍一下
GC暂停你知道是在什么位置暂停的吗?那个位置的专业名词是什么?
你知道这个安全点的概念,但是真正让你分析的时候你能发现吗?我知道有GC安全,但是你知道怎么去找这个安全点吗?你该怎么从代码中去定位这个GC时间过长的代码位置的?
结论
HR面开了15*14好像是双非的最高价了,已拒,因为绩效逆天+我不想去苏州
感觉没线下见到这个二面面试官还是有点遗憾,这个二面面试官算是我这2年遇到的最好的几个面试官了,很有激情和技术热情,问我是怎么学习的,跟我说网上的博客以及一些书很垃圾,甚至现场去京东搜他的购物记录给我推荐mysql和jvm要看什么书,那个散列值的考量就是书里面的东西。同时他还会针对我的代码逻辑,给我更加全面的解决方案以及设计一些陷阱题例如SQL优化到如何考量一个字段是否加索引,我说的是业务层面的,他就给我说了散列值这个东西。还有就是问分布式的时候故意说一个SpringCloud让我把微服务思路理解到SpringCloudAlibaba生态,考验我是否真的知道分布式,以及最后问我的ID发号器是如何实现的,然后提出我这个是代码层面的完善处理,但是并不是业务层和架构层的完善处理,就算你发号成功了又怎么样呢?重点不在于你是否真的发号成功进行降级了,而是你降级后你还要让开发人员感知到出现了时钟回拨,如果感知不到或者没有为发号器加性能监控,那么后面这个发号为了追上时钟回拨降低了整个系统的性能怎么办?
这二面真算是最好的几次面试了,有个工作7,8年的老大哥现场教导你一样循循善诱,我甚至让hr带话夸了一下这个二面面试官哈哈哈。我面试的中大厂的面试官每次都能指出方案中存在的小问题,然后给出更好的建议相反有一些小厂的面试官狂的一批,交流起来连基本的场景都不能理解,看他的发言就知道什么成分和level了,例如就是丁香园这种吊小厂的面试官
查看16道真题和解析