默契破冰(玩吧)Java后端社招面经:深度业务场景与IM系统设计
《面试题目》
- 简单做下自我介绍
- 讲一个你解决问题的思路/项目难点
- 接口变成慢接口,你的通用排查思路是什么
- 极端场景:数据库、SQL 都正常,但高峰期接口有毛刺、RT 波动,监控基本正常,只有线程状态不正常,怎么排查,多个维度思考
- 线程 BLOCKED 状态一般出现在什么情况下
- synchronized 加锁时线程状态是什么?ReentrantLock 加锁时线程状态是什么,其他等待的线程的状态呢?
- 讲一下你对线程池的理解
- 线程池的核心线程是什么时候创建的
- 线程池 keepAliveTime 这个参数是干什么的?怎么控制空闲线程的存活时间
- 手撸一个通用的池化技术实现(支持借用、归还、过期淘汰)
- 讲一下你最近在比心的这个项目,以及你在项目中的职责
- 你们项目整体业务架构是怎样的?分了几层
- 项目是单体还是分布式?流量是怎么流转的
- 项目用的是 MVC 还是 DDD 架构,了解ddd吗
- 讲一下 Apollo 配置中心的原理
- 服务启动时怎么拿到配置?配置更新后怎么同步到服务?
- 集群规模很大、实例很多时,配置变更怎么保证及时通知到所有节点
- 在项目里遇到过什么比较严重/难排查的线上问题
- 礼物发送为什么用长连接(WebSocket),而不是 HTTP
- HTTP 也能长连接(keep-alive),为什么还要用 WebSocket
- 详细讲一下礼物连击、送礼统计的整个流程设计
- 礼物服务是有状态还是无状态?多实例部署下怎么统计全局连击次数
- 你们礼物信息、运营配置是谁维护的?缓存怎么做的
- 本地缓存如何实现及时更新,而不是等过期才淘汰
- 怎么保证本地缓存和 DB 的一致性
- 讲一下分布式事务,以及常用方案
- 你们项目里用的是哪种分布式事务?保证的是最终一致性还是强一致性
- 礼物扣款和横幅推送这两个操作,你们是怎么保证一致性的
- 推送时机是在扣钱同时触发,还是扣钱完成后再触发
- 如果让你设计一个简单的 IM 聊天系统(只发文本),架构怎么设计
- 如何保证消息不丢失
- 如何保证群聊/单聊消息的顺序性
- 大量用户、高并发下,消息序列号怎么保证唯一
- 消息存储怎么做?会选取什么数据结构?用户离线消息怎么处理
- 如果用户很久不上线(10 天半个月),消息怎么处理,避免队列积压
- 服务节点宕机,怎么保证消息不丢、用户上线后能收到,主从切换如何保证连接的一致性?
- 平时工作中有用过 AI 吗?用来做什么
- 举一个你用 AI 解决实际工作问题的例子
- 你怎么看待现在 AI 对开发、对行业的影响
- 最近有看过什么源码吗?为什么看
- 为什么从上家公司离职
- 你理解的“稳定性”是指什么
- 你更喜欢做哪类业务?职业规划是什么
- 最近短期有什么学习/提升计划
- 你有什么想问我的
《参考解析》
- 接口慢排查:从前端(网络)、网关、服务端(线程池、GC、慢SQL)、下游依赖(外部RPC)、数据库负载五个维度排查。重点检查线程池积压、Full GC、锁争用。
- 线程状态与锁:synchronized进入阻塞态是BLOCKED;ReentrantLock基于AQS,等待时通常是WAITING或TIMED_WAITING。BLOCKED通常源于synchronized锁竞争。
- 线程池控制:核心线程在任务到来时创建(corePoolSize未满)。keepAliveTime用于非核心线程在空闲达到该时间后被回收,防止资源浪费。
- 分布式配置中心(Apollo):原理基于HTTP长轮询(Long Polling)。客户端定时拉取与推送更新(基于Spring事件机制),配合本地缓存防止服务不可用。
- IM系统设计:利用WebSocket保持长连接。消息顺序性通过递增序列号+单分区消费(或Kafka分区路由)保证;丢消息通过ACK机制和消息重传解决;离线消息存入Redis或存储层,用户上线后主动拉取未读消息。