针对我的简历模拟面试


一、业务场景问题

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机制)

三、问题设计逻辑

  1. 业务场景问题:紧扣电商高频场景(秒杀、缓存、微服务、实时通信),结合候选人项目经验(至),考察技术落地能力与问题解决思路。
  2. Java基础问题:围绕候选人掌握的技术栈(至),从原理、应用、优化三个层面深入,兼顾理论与实践。
  3. 延伸追问:每个问题可根据候选人回答进一步深挖,例如问完Seata AT模式后,可追问与TCC模式的对比,或抖音电商场景的技术选型逻辑,考察技术广度与深度。

以下是根据你的简历和面试问题设计的针对性回答,突出项目经验和技术亮点,符合真实面试场景:


一、业务场景问题

1. 高并发与缓存场景

优化锁粒度方案

在秒杀系统中,我会采用 分段锁 优化(如将库存拆分为10个子库存)。简历中的优惠券秒杀项目证明,Redisson分布式锁+Kafka异步处理已解决超卖问题(吞吐量800QPS)。不用数据库行锁原因:

  1. 行锁在超高并发下(如抖音百万QPS)会导致大量线程阻塞,MySQL连接池打满;
  2. 事务持有时间过长(包含业务逻辑),而分布式锁只需锁库存扣减(<10ms)。

Kafka消费延迟兜底方案

  1. 双重校验:消费前二次查询Redis库存(简历中缓存优化方案已验证);
  2. 定时对账:基于SpringTask(简历中超时订单处理经验)扫描未完成订单,触发库存回滚。

商品缓存雪崩兜底

  1. 本地缓存:用Caffeine做二级缓存(短时过期,扛过Redis崩溃期);
  2. 熔断降级:参考Sentinel(微服务项目经验),缓存失效时返回静态页面。

2. 微服务架构与分布式事务

Seata AT模式实现

  1. 一阶段:业务SQL被Seata代理,生成UNDO_LOG(简历中回滚耗时从3s→500ms);
  2. 二阶段失败:Seata靠UNDO_LOG重试(异步线程池),若重试失败则人工介入(如邮件告警,参考简历中Sentinel告警设计)。

抖音支付场景适用性

AT模式适用 抖音支付:订单支付链路短(用户→支付→库存),且AT对代码侵入低。但大促时建议改用TCC模式(简历中未实践),因AT全局锁在长事务下易阻塞。

Nacos网络波动处理

  1. 心跳检测:Nacos 15秒摘除异常实例(简历中服务注册经验);
  2. 集群容错:OpenFeign+Sentinel(简历方案)自动降级故障节点;
  3. 优雅下线:服务关闭前先调Nacos API注销,网关延迟10秒更新路由(简历中Spring Cloud Gateway动态路由经验)。

3. 实时性与异步处理

WebSocket优化方案

适用订单通知(简历中已实现<500ms延迟),但抖音用户量级需优化:

  1. 连接管理:Netty代替Tomcat原生WebSocket(简历未实现,可补充);
  2. SSE替代场景:对实时性要求较低的通知(如发货提醒)用SSE,减少服务端压力。

消息积压排查维度

基于简历RabbitMQ优化经验(1900 QPS):

  1. 消费者瓶颈:扩容消费者实例(Kafka增加partition);
  2. 消息堆积阈值:在Sentinel设置流控规则(简历中Sentinel经验);
  3. 重试机制:设置指数退避重试(如1s/3s/10s),超过3次转死信队列人工处理。

二、Java基础与并发

1. 锁选择与ThreadLocal

库存扣减锁方案

ReentrantLock(非synchronized),原因:

  1. 支持公平锁(避免线程饥饿),简历中Redisson锁已验证;
  2. 可响应中断(如分布式锁获取超时需回滚)。

ThreadLocal分布式问题

用户会话存ThreadLocal在分布式下失效(多实例)。解决方案

  1. 改用Redis存储会话(简历中Redis缓存经验);
  2. 网关层透传UserID(简历中JWT方案)。

2. 数据库与缓存

订单隔离级别

Read Committed(默认级别)。抖音订单创建需平衡性能与一致性:

  1. 幻读概率低(用户不会高频查未支付订单);
  2. 用唯一索引防重复下单(简历中优惠券秒杀防超卖经验)。

Redis脑裂规避方案

  1. Redisson看门狗:自动续期锁(简历项目已验证);
  2. 最小主节点数 :集群部署时要求多数节点确认(N/2+1)。若遇主节点宕机,用异步落盘补偿(类似Seata UNDO_LOG)。

三、框架与中间件

1. Spring Boot自动装配

抖音电商应用案例

自定义支付超时配置(参考简历SpringTask定时任务):

java 复制代码
@AutoConfiguration
@EnableScheduling // 启用定时任务
public class PaymentTimeoutAutoConfig {
    @Bean
    public TaskScheduler taskScheduler() {
        return new ThreadPoolTaskScheduler(); // 线程池优化
    }
}
2. Kafka分区优化

消费延迟定位

  1. 监控工具:Kafka Eagle监控分区Lag(简历中Kafka项目可延伸);
  2. 动态扩容:增加该分区Consumer实例;
  3. 避免Rebalance:用静态分区分配(StickyAssignor)。

扩展补充

TCC场景:你在抖音电商下单买奶茶

  1. Try(尝试)

    • 你打电话给奶茶店:"老板,我要一杯珍珠奶茶,先别做!帮我看看有没有珍珠、有没有杯子?"

    • 老板查库存:冻结1份珍珠+1个杯子(资源预留),回复你:"有货!先给你占着,30分钟不付款就释放。"

    • 对应系统 :订单服务冻结库存、优惠券服务锁定优惠券、支付服务预扣款(但不真正执行)。

  2. Confirm(确认)

    • 你扫码付款成功,告诉老板:"钱付了,开始做奶茶吧!"

    • 老板立刻用刚才冻结的珍珠和杯子做好奶茶。

    • 对应系统 :所有服务正式提交(减库存、用优惠券、扣款)。

  3. Cancel(取消)

    • 如果你付款失败(或超时),告诉老板:"不要了!"

    • 老板把冻结的珍珠和杯子退回库存

    • 对应系统 :所有服务回滚预留操作(解冻库存、释放优惠券、解冻金额)。


TCC的核心特点(对比AT模式)

场景 AT模式(简历中用的) TCC模式
原理 数据库自动回滚(像魔法) 手动写代码控制每一步(像开关)
性能 全局锁,高并发易阻塞 无锁,性能更高(适合抖音大促)
代码复杂度 简单(框架自动代理SQL) 复杂(要写Try/Confirm/Cancel三个接口)
适用场景 短事务(如支付链路) 长事务、跨多服务复杂操作(如退款)

抖音电商为什么可能用TCC?

  • 大促秒杀 :10万人抢1万杯奶茶,用AT模式会锁住库存导致卡顿,TCC的 "先占坑再确认" 更流畅。

  • 灵活回滚 :比如退款时需依次解冻库存、退优惠券、打款,TCC可精确控制每一步回滚逻辑

  • 避免AT的缺陷:AT模式在跨多服务长事务中,全局锁可能拖垮数据库(你简历中Seata优化的是短事务)。


一句话总结

TCC = 办事前先打电话占坑(Try),成功了再动手(Confirm),失败了就撤销占坑(Cancel)。

它用手动管理换取了更高性能和灵活性,适合抖音这种超高并发场景,但代码写起来更费劲。

相关推荐
Lee川15 小时前
优雅进化的JavaScript:从ES6+新特性看现代前端开发范式
javascript·面试
Lee川18 小时前
从异步迷雾到优雅流程:JavaScript异步编程与内存管理的现代化之旅
javascript·面试
晴殇i20 小时前
揭秘JavaScript中那些“不冒泡”的DOM事件
前端·javascript·面试
绝无仅有21 小时前
Redis过期删除与内存淘汰策略详解
后端·面试·架构
绝无仅有21 小时前
Redis大Key问题排查与解决方案全解析
后端·面试·架构
AAA梅狸猫1 天前
Looper.loop() 循环机制
面试
AAA梅狸猫1 天前
Handler基本概念
面试
Wect1 天前
浏览器缓存机制
前端·面试·浏览器
掘金安东尼1 天前
Fun with TypeScript Generics:玩转 TS 泛型
前端·javascript·面试
掘金安东尼1 天前
Next.js 企业级落地
前端·javascript·面试