25年11月快手 Java开发 一面

#JAVA##JAVA面经##JAVA内推#

1. 项目中使用RocketMQ保证消息顺序,具体如何实现?(如按订单ID分区)

思路

核心围绕“同业务消息同队列+单线程消费”展开,先讲生产端路由规则,再讲消费端配置,结合实际项目场景说清楚落地细节。

回答示例

面试官您好,我们项目里保证消息顺序,主要是靠订单ID做分区路由,再配合单线程消费来实现的。首先生产端这边,我们会给Topic建多个队列,发送消息的时候,拿订单ID做哈希取模,算出来一个队列下标,保证同一个订单的所有消息,全都发到同一个队列里,因为RocketMQ单个队列里的消息本身就是按发送顺序排好的。然后消费端这边,我们把消费线程数设置成和队列数一致,每个队列只对应一个消费线程,避免多线程抢着消费打乱顺序,而且禁用了批量消费,确保消息一个一个按顺序处理,这样从生产到消费全链路就保证了消息的顺序性。

2. SQL慢查询优化,explain输出中key_len和rows指标如何分析?

思路

先分别解释两个指标的含义,再讲分析逻辑,结合实际优化场景,说明指标异常对应的问题和优化方向。

回答示例

其实这两个指标是看慢查询的关键,我平时排查的时候经常用。先说key_len,它代表实际用到的索引长度,能看出来索引有没有用全。比如联合索引建了两个字段,key_len如果只等于第一个字段的长度,说明只用到了前缀索引,后面的字段没生效,SQL就得调整。要是key_len是null,那就是压根没走索引,全表扫描了。然后rows是MySQL预估要扫描的行数,这个数肯定是越小越好,要是rows特别大,哪怕走了索引,也说明索引选的不对或者统计信息过期了,要么优化索引,要么更新下表的统计信息就行。

3. Linux实时监控日志中包含"timeout"的命令(如tail -f | grep timeout)

思路

先讲基础核心命令,再补充常用扩展用法,结合项目排查场景说清楚每个参数的作用,口语化说明操作逻辑。

回答示例

我平时排查超时问题,最常用的就是实时盯日志过滤关键词。基础命令就是tail -f 日志文件路径 | grep "timeout",这样就能实时看到新增的超时日志。要是想看得更清楚,就加个--color=auto,把timeout标亮。有时候还需要看超时前后的上下文,就用grep -C 5 "timeout",能多显示5行上下文,方便定位原因。如果想同时过滤超时和错误,就用grep -E "timeout|error",一次性把关键日志都揪出来。

4. Java中IllegalStateException和NullPointerException的区别及使用场景

思路

先讲核心区别,再分别举例说明场景,用通俗的语言区分“对象不存在”和“对象状态不对”两种情况。

回答示例

这两个异常很好区分,根本原因完全不一样。NullPointerException也就是空指针,是你调用了一个null对象的方法,相当于这个对象压根就没创建,你非要用它,就报这个错。比如你定义了一个字符串变量没赋值,直接调用length方法,肯定是空指针。而IllegalStateException是非法状态异常,这个对象是存在的,但是它当前的状态不允许你做这个操作。比如流已经关闭了,你还往里写数据;线程池已经停了,你还提交任务,这时候对象是好的,就是状态不对,就会抛这个异常。

5. 线程池核心参数设置依据:corePoolSize=20,maximumPoolSize=50,workQueue=LinkedBlockingQueue(1000)

思路

结合业务场景、任务类型、机器配置,分别解释每个参数的设置逻辑,说明参数之间的配合关系和设计初衷。

回答示例

这组参数是我们结合业务实际情况调出来的,先说核心线程20,我们的任务大多是IO密集型的,比如查数据库、调接口,CPU空闲时间多,核心线程设20刚好能应对日常的请求量,而且常驻

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

本专栏在精不在多,内容分为八股文、大厂真实面经,面试通过后将offer和面试题私发给我,可退还专栏的收益部分费用。欢迎大家共建专栏

全部评论

相关推荐

03-16 11:07
南开大学 Java
牛马人的牛马人生:快手卡实习经历的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务