针对我的简历模拟面试
一、业务场景问题
1. 高并发与缓存场景
- 在电商秒杀场景中,你曾用Redisson分布式锁+Kafka解决超卖问题()。如果现在让你设计抖音电商的限时秒杀系统,你会如何优化锁粒度?为什么不直接用数据库行锁?若Kafka消费延迟导致库存回滚失败,如何处理?
- 你在“及时送”项目中用Redis缓存商铺信息,将访问时间从128ms优化到70ms()。抖音电商的商品详情页缓存如何设计?如果遇到缓存雪崩,除了差异化过期时间,还有哪些兜底方案?
2. 微服务架构与分布式事务
- 在电商微服务重构项目中,你用Seata AT模式将事务回滚耗时从3s降至500ms()。AT模式的两阶段提交具体如何实现?若第二阶段提交失败,Seata如何处理?抖音电商的订单支付场景是否适合用AT模式?为什么?
- 你通过Nacos实现服务注册发现(),若抖音电商的用户服务集群中部分实例网络波动,Nacos如何保证服务调用的可用性?服务下线时如何避免流量打到失效实例?
3. 实时性与异步处理
- “及时送”项目用WebSocket实现来单提醒(),抖音电商的订单状态变更通知是否适用WebSocket?若用户量激增,如何优化WebSocket的长连接管理?是否考虑过用Server-Sent Events(SSE)替代?
- 在订单状态更新中,你用RabbitMQ异步通知使吞吐量提升至1900 QPS()。若抖音电商的订单消息积压超过10万条,你会从哪些维度排查问题?如何设计消息重试机制避免循环重试?
4. 搜索与数据优化
- 你用ElasticSearch将商品搜索响应时间从1s优化到100ms()。抖音电商的商品搜索需要支持“热搜词推荐”和“拼音联想”,你会如何设计ES索引结构?分词器选择IK Analyzer还是自定义分词器?为什么?
- 抖音电商的订单数据量每天增长100万条,若用MySQL存储,你会如何设计分库分表策略?分片键选择订单ID还是用户ID?如何解决跨分片查询的性能问题?
二、Java八股与基础技术
1. Java基础与并发
- 谈谈Java中synchronized和ReentrantLock的区别。在抖音电商的库存扣减场景中,你会选哪种锁?为什么?(可延伸问AQS原理)
- 你提到熟练掌握Java多线程(),请解释ThreadLocal的实现原理。若抖音电商的用户会话信息用ThreadLocal存储,在分布式环境下会遇到什么问题?如何解决?
2. 数据库与缓存
- MySQL的事务隔离级别有哪些?你在项目中如何处理幻读问题()?抖音电商的订单创建场景应该用哪种隔离级别?
- Redis的分布式锁如何实现原子性?你在项目中用Redisson实现锁(),若主节点宕机导致锁丢失,如何避免“脑裂”问题?(可延伸问Redlock算法)
3. 计算机网络与微服务
- HTTP/1.1和HTTP/2的主要区别是什么?抖音电商的前端页面加载如何利用HTTP/2优化?(可延伸问TCP连接复用、头部压缩)
- 你用OpenFeign实现服务远程调用(),若目标服务响应超时,Feign的熔断和降级策略如何配置?请举例说明抖音电商的“商品详情服务”熔断时的降级方案。
4. 框架与中间件
- Spring Boot的自动装配原理是什么?你在项目中是否自定义过AutoConfiguration?请举例说明抖音电商的某个功能如何通过自动装配简化开发()。
- Kafka的分区(Partition)设计如何提升吞吐量?在抖音电商的订单消息消费中,若某个分区消费缓慢导致整体延迟,如何定位和优化?(可延伸问Rebalance机制)
三、问题设计逻辑
- 业务场景问题:紧扣电商高频场景(秒杀、缓存、微服务、实时通信),结合候选人项目经验(至),考察技术落地能力与问题解决思路。
- Java基础问题:围绕候选人掌握的技术栈(至),从原理、应用、优化三个层面深入,兼顾理论与实践。
- 延伸追问:每个问题可根据候选人回答进一步深挖,例如问完Seata AT模式后,可追问与TCC模式的对比,或抖音电商场景的技术选型逻辑,考察技术广度与深度。
以下是根据你的简历和面试问题设计的针对性回答,突出项目经验和技术亮点,符合真实面试场景:
一、业务场景问题
1. 高并发与缓存场景
优化锁粒度方案:
在秒杀系统中,我会采用 分段锁 优化(如将库存拆分为10个子库存)。简历中的优惠券秒杀项目证明,Redisson分布式锁+Kafka异步处理已解决超卖问题(吞吐量800QPS)。不用数据库行锁原因:
- 行锁在超高并发下(如抖音百万QPS)会导致大量线程阻塞,MySQL连接池打满;
- 事务持有时间过长(包含业务逻辑),而分布式锁只需锁库存扣减(<10ms)。
Kafka消费延迟兜底方案:
- 双重校验:消费前二次查询Redis库存(简历中缓存优化方案已验证);
- 定时对账:基于SpringTask(简历中超时订单处理经验)扫描未完成订单,触发库存回滚。
商品缓存雪崩兜底:
- 本地缓存:用Caffeine做二级缓存(短时过期,扛过Redis崩溃期);
- 熔断降级:参考Sentinel(微服务项目经验),缓存失效时返回静态页面。
2. 微服务架构与分布式事务
Seata AT模式实现:
- 一阶段:业务SQL被Seata代理,生成UNDO_LOG(简历中回滚耗时从3s→500ms);
- 二阶段失败:Seata靠UNDO_LOG重试(异步线程池),若重试失败则人工介入(如邮件告警,参考简历中Sentinel告警设计)。
抖音支付场景适用性:
AT模式适用抖音支付:订单支付链路短(用户→支付→库存),且AT对代码侵入低。但大促时建议改用TCC模式(简历中未实践),因AT全局锁在长事务下易阻塞。
Nacos网络波动处理:
- 心跳检测:Nacos 15秒摘除异常实例(简历中服务注册经验);
- 集群容错:OpenFeign+Sentinel(简历方案)自动降级故障节点;
- 优雅下线:服务关闭前先调Nacos API注销,网关延迟10秒更新路由(简历中Spring Cloud Gateway动态路由经验)。
3. 实时性与异步处理
WebSocket优化方案:
适用订单通知(简历中已实现<500ms延迟),但抖音用户量级需优化:
- 连接管理:Netty代替Tomcat原生WebSocket(简历未实现,可补充);
- SSE替代场景:对实时性要求较低的通知(如发货提醒)用SSE,减少服务端压力。
消息积压排查维度:
基于简历RabbitMQ优化经验(1900 QPS):
- 消费者瓶颈:扩容消费者实例(Kafka增加partition);
- 消息堆积阈值:在Sentinel设置流控规则(简历中Sentinel经验);
- 重试机制:设置指数退避重试(如1s/3s/10s),超过3次转死信队列人工处理。
二、Java基础与并发
1. 锁选择与ThreadLocal
库存扣减锁方案:
选ReentrantLock(非synchronized),原因:
- 支持公平锁(避免线程饥饿),简历中Redisson锁已验证;
- 可响应中断(如分布式锁获取超时需回滚)。
ThreadLocal分布式问题:
用户会话存ThreadLocal在分布式下失效(多实例)。解决方案:
- 改用Redis存储会话(简历中Redis缓存经验);
- 网关层透传UserID(简历中JWT方案)。
2. 数据库与缓存
订单隔离级别:
选Read Committed(默认级别)。抖音订单创建需平衡性能与一致性:
- 幻读概率低(用户不会高频查未支付订单);
- 用唯一索引防重复下单(简历中优惠券秒杀防超卖经验)。
Redis脑裂规避方案:
- Redisson看门狗:自动续期锁(简历项目已验证);
- 最小主节点数:集群部署时要求多数节点确认(N/2+1)。若遇主节点宕机,用异步落盘补偿(类似Seata UNDO_LOG)。
三、框架与中间件
1. Spring Boot自动装配
抖音电商应用案例:
自定义支付超时配置(参考简历SpringTask定时任务):
@AutoConfiguration
@EnableScheduling // 启用定时任务
public class PaymentTimeoutAutoConfig {@Beanpublic TaskScheduler taskScheduler() {return new ThreadPoolTaskScheduler(); // 线程池优化}
}
2. Kafka分区优化
消费延迟定位:
- 监控工具:Kafka Eagle监控分区Lag(简历中Kafka项目可延伸);
- 动态扩容:增加该分区Consumer实例;
- 避免Rebalance:用静态分区分配(StickyAssignor)。
扩展补充
TCC场景:你在抖音电商下单买奶茶
-
Try(尝试):
-
你打电话给奶茶店:“老板,我要一杯珍珠奶茶,先别做!帮我看看有没有珍珠、有没有杯子?”
-
老板查库存:冻结1份珍珠+1个杯子(资源预留),回复你:“有货!先给你占着,30分钟不付款就释放。”
-
对应系统:订单服务冻结库存、优惠券服务锁定优惠券、支付服务预扣款(但不真正执行)。
-
-
Confirm(确认):
-
你扫码付款成功,告诉老板:“钱付了,开始做奶茶吧!”
-
老板立刻用刚才冻结的珍珠和杯子做好奶茶。
-
对应系统:所有服务正式提交(减库存、用优惠券、扣款)。
-
-
Cancel(取消):
-
如果你付款失败(或超时),告诉老板:“不要了!”
-
老板把冻结的珍珠和杯子退回库存。
-
对应系统:所有服务回滚预留操作(解冻库存、释放优惠券、解冻金额)。
-
TCC的核心特点(对比AT模式)
场景 | AT模式(简历中用的) | TCC模式 |
---|---|---|
原理 | 数据库自动回滚(像魔法) | 手动写代码控制每一步(像开关) |
性能 | 全局锁,高并发易阻塞 | 无锁,性能更高(适合抖音大促) |
代码复杂度 | 简单(框架自动代理SQL) | 复杂(要写Try/Confirm/Cancel三个接口) |
适用场景 | 短事务(如支付链路) | 长事务、跨多服务复杂操作(如退款) |
抖音电商为什么可能用TCC?
-
大促秒杀:10万人抢1万杯奶茶,用AT模式会锁住库存导致卡顿,TCC的 “先占坑再确认” 更流畅。
-
灵活回滚:比如退款时需依次解冻库存、退优惠券、打款,TCC可精确控制每一步回滚逻辑。
-
避免AT的缺陷:AT模式在跨多服务长事务中,全局锁可能拖垮数据库(你简历中Seata优化的是短事务)。
一句话总结
TCC = 办事前先打电话占坑(Try),成功了再动手(Confirm),失败了就撤销占坑(Cancel)。
它用手动管理换取了更高性能和灵活性,适合抖音这种超高并发场景,但代码写起来更费劲。