面试官: 高并发系统常见问题解析(答案深度解析)持续更新

张开发
2026/4/13 7:46:35 15 分钟阅读

分享文章

面试官: 高并发系统常见问题解析(答案深度解析)持续更新
高并发系统常见问题 —— 面试深度解析Java 后端视角⚠️ 注意这道题不是让你背“五个名词”而是考察你是否真正踩过坑、调过参、救过火。面试官想听的是你遇到过什么怎么定位的为什么这么解决有没有踩过典型误区一、五大高频问题逐个拆解附真实场景1️⃣ 请求堆积 → 表象是“系统变慢”根因是资源耗尽 队列雪崩原理Tomcat 默认maxThreads200若每请求耗时 500ms理论吞吐仅 400 QPS一旦突增到 2000 QPS大量请求排队在acceptCount队列默认100中 → 用户看到“503 Service Unavailable”或超时。误区警示❗✅ 错误做法“把maxThreads调到 1000” → 线程过多引发频繁 GC、CPU 上下文切换飙升系统反而更卡。✅ 正确思路限流Sentinel/Guava RateLimiter 降级返回兜底数据 异步化把耗时操作扔进线程池/消息队列// 示例用 Sentinel 控制下单接口 QPS ≤ 1000SentinelResource(valuecreateOrder,blockHandlerhandleBlock)publicOrdercreateOrder(OrderReqreq){returnorderService.create(req);}publicResulthandleBlock(OrderReqreq,BlockExceptionex){returnResult.fail(当前下单人数过多请稍后再试);// 优雅降级}2️⃣ 缓存击穿 → 单个热点 Key 失效瞬间所有请求穿透到 DB原理比如“热搜榜第1名”Key 过期10万用户同时查 → 全部打到数据库DB CPU 瞬间 100%。经典误区❗❌ “加互斥锁就完事了” → Redis 分布式锁如 setnx若没设置超时时间或业务异常未释放锁会导致永久阻塞✅ 正解逻辑过期 双重检查 异步重建缓存推荐// 伪代码防止击穿的 getHotItem()StringcacheKeyhot:item:1;Stringjsonredis.get(cacheKey);if(json!null)returnJSON.parse(json);// 加锁重建注意锁必须带超时StringlockKeylock:cacheKey;if(redis.set(lockKey,1,NX,EX,10)){// 10秒自动释放try{Itemitemdb.selectById(1);// 查库StringdataJSON.toJSONString(item);// 写入缓存逻辑过期时间如 5min实际不设 TTLredis.setex(cache:cacheKey,300,data);}finally{redis.del(lockKey);}}else{Thread.sleep(50);// 小睡后重试避免自旋returngetHotItem();// 递归重试生产慎用建议用队列通知}3️⃣ 数据库死锁 → 不是“锁太多”而是事务执行顺序错乱原理事务 A 持有行锁 1申请行锁 2事务 B 持有行锁 2申请行锁 1 → 循环等待。关键洞察MySQL InnoDB 的死锁检测是主动的每秒唤醒一次检测线程但死锁日志藏得深✅ 必查命令SHOW ENGINE INNODB STATUS\G→ 看LATEST DETECTED DEADLOCK区域。致命误区❗❌ “加索引就能防死锁” → 错无索引走全表扫描锁升级为表锁死锁概率更高。✅ 正解按固定顺序更新如 ID 升序、缩短事务时间、避免在事务中调远程服务4️⃣ 线程安全问题 → 最隐蔽的“幽灵 Bug”典型场景用SimpleDateFormat解析时间非线程安全→ 偶发java.lang.NumberFormatExceptionHashMap在多线程 put → 扩容时链表成环get()死循环JDK7。面试必答点✅ 替代方案DateTimeFormatter线程安全、ConcurrentHashMap、ThreadLocalSimpleDateFormat注意内存泄漏需 remove()✅ 根本解法无状态设计 加锁 同步容器5️⃣ 消息积压 → Kafka/RocketMQ 消费不动不是 MQ 问题是消费者太弱真相消费端单线程处理一条消息要 200ms而生产端每秒发 1000 条 → 积压指数级增长。错误姿势❗❌ 盲目增加消费者实例 → 若消费逻辑含数据库写可能引发主键冲突、重复消费。✅ 正解先扩容消费者分区数 ≥ 消费者数 优化单条消费耗时异步落库、批量写 设置死信队列兜底二、高阶思维别只盯着“问题”要建防御性架构心智模型层级关键动作工具示例入口层全链路限流、黑白名单、WAF防护Sentinel、Nginx、阿里云WAF服务层异步化CompletableFuture、熔断降级、线程池隔离Hystrix老、Resilience4j、自定义线程池存储层读写分离、分库分表ShardingSphere、冷热分离MySQL 主从、MyCat、TiDB监控层全链路追踪TraceID、指标埋点QPS/RT/错误率、日志聚合SkyWalking、Prometheus Grafana、ELK 最后送一句实战箴言“高并发不是压测跑出来的是故障推演逼出来的。”下次上线前不妨问自己如果 Redis 宕机了如果 DB 主库挂了如果第三方支付回调超时了—— 答案不在代码里而在你的预案中。全文约 1120 字覆盖原理、误区、代码、架构思维可直接用于技术面试深度作答更多Java面试题整理JVM面试题MySQL面试题Redis面试题Spring面试题完整面试题库https://myquotego.com/html/questions?_fromcsdn_123_4

更多文章