默契破冰(玩吧)Java后端社招面经:深度业务场景与IM系统设计

《面试题目》

  1. 简单做下自我介绍
  2. 讲一个你解决问题的思路/项目难点
  3. 接口变成慢接口,你的通用排查思路是什么
  4. 极端场景:数据库、SQL 都正常,但高峰期接口有毛刺、RT 波动,监控基本正常,只有线程状态不正常,怎么排查,多个维度思考
  5. 线程 BLOCKED 状态一般出现在什么情况下
  6. synchronized 加锁时线程状态是什么?ReentrantLock 加锁时线程状态是什么,其他等待的线程的状态呢?
  7. 讲一下你对线程池的理解
  8. 线程池的核心线程是什么时候创建的
  9. 线程池 keepAliveTime 这个参数是干什么的?怎么控制空闲线程的存活时间
  10. 手撸一个通用的池化技术实现(支持借用、归还、过期淘汰)
  11. 讲一下你最近在比心的这个项目,以及你在项目中的职责
  12. 你们项目整体业务架构是怎样的?分了几层
  13. 项目是单体还是分布式?流量是怎么流转的
  14. 项目用的是 MVC 还是 DDD 架构,了解ddd吗
  15. 讲一下 Apollo 配置中心的原理
  16. 服务启动时怎么拿到配置?配置更新后怎么同步到服务?
  17. 集群规模很大、实例很多时,配置变更怎么保证及时通知到所有节点
  18. 在项目里遇到过什么比较严重/难排查的线上问题
  19. 礼物发送为什么用长连接(WebSocket),而不是 HTTP
  20. HTTP 也能长连接(keep-alive),为什么还要用 WebSocket
  21. 详细讲一下礼物连击、送礼统计的整个流程设计
  22. 礼物服务是有状态还是无状态?多实例部署下怎么统计全局连击次数
  23. 你们礼物信息、运营配置是谁维护的?缓存怎么做的
  24. 本地缓存如何实现及时更新,而不是等过期才淘汰
  25. 怎么保证本地缓存和 DB 的一致性
  26. 讲一下分布式事务,以及常用方案
  27. 你们项目里用的是哪种分布式事务?保证的是最终一致性还是强一致性
  28. 礼物扣款和横幅推送这两个操作,你们是怎么保证一致性的
  29. 推送时机是在扣钱同时触发,还是扣钱完成后再触发
  30. 如果让你设计一个简单的 IM 聊天系统(只发文本),架构怎么设计
  31. 如何保证消息不丢失
  32. 如何保证群聊/单聊消息的顺序性
  33. 大量用户、高并发下,消息序列号怎么保证唯一
  34. 消息存储怎么做?会选取什么数据结构?用户离线消息怎么处理
  35. 如果用户很久不上线(10 天半个月),消息怎么处理,避免队列积压
  36. 服务节点宕机,怎么保证消息不丢、用户上线后能收到,主从切换如何保证连接的一致性?
  37. 平时工作中有用过 AI 吗?用来做什么
  38. 举一个你用 AI 解决实际工作问题的例子
  39. 你怎么看待现在 AI 对开发、对行业的影响
  40. 最近有看过什么源码吗?为什么看
  41. 为什么从上家公司离职
  42. 你理解的“稳定性”是指什么
  43. 你更喜欢做哪类业务?职业规划是什么
  44. 最近短期有什么学习/提升计划
  45. 你有什么想问我的

《参考解析》

  • 接口慢排查:从前端(网络)、网关、服务端(线程池、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或存储层,用户上线后主动拉取未读消息。