即时设计Java后端社招一面面经
- 轮次
- 一面
- 时间
- 2026-09
- 来源
- 牛客网
《面试题目》
- 如果分片任务失败,如何设计兜底方案?任务分片如何拆分?
- 发送方如何限流?MQ 如何实现限流?
- MQ 发布订阅和事件驱动在设计上有什么区别?
- 如何创建异步线程?Thread、Future 和 CompletableFuture 分别解决什么问题?
- Future 内部方法异常时如何处理?响应式编程与 CompletableFuture 有什么区别?
- 关系型数据库和非关系型数据库有什么优劣?如何排查慢接口和 MQ 积压?
- RocketMQ 有哪些组件?
- 一台机器一次只能执行一个任务,只能水平扩展,如何设计服务?
- 前端除了轮询还能如何接收结果?前端尚未准备好时如何避免消息丢失?普通请求如何升级为 WebSocket?
- 如何求二叉树的侧视图?
《参考解析》
- 按任务键分片并记录进度,失败任务可重试、转人工或补偿;分片要可重入、幂等并支持重新分配。
- 令牌桶、漏桶和并发信号量都可限流,MQ 侧还需控制生产速率、消费者并发和队列积压告警。发布订阅强调消息分发,事件驱动强调业务状态变化与解耦。
- Thread 是基础执行单元,Future 表示异步结果,CompletableFuture 支持组合、异常处理和超时;响应式编程以非阻塞流和背压组织连续事件。
- 关系库适合事务和复杂查询,非关系库适合高吞吐和灵活结构。慢接口看链路耗时,积压看生产消费速率、分区和消费异常。
- RocketMQ 主要包含 NameServer、Broker、Producer、Consumer 和 Topic/Queue。单机串行执行可用分布式任务队列加租约锁,水平扩展消费者。
- 结果可通过 WebSocket、SSE 或回调推送;服务端先持久化消息和消费位点,客户端连接后补发。HTTP Upgrade 握手成功后进入 WebSocket 帧通信。
- 侧视图按层序遍历,每层只记录最后一个节点;也可用 DFS,优先访问右子树并记录首次到达的深度。