Java大厂面试实录电商高并发场景下的技术栈深度解析前言本文记录了一场真实的互联网大厂Java技术面试面试官严肃专业求职者谢飞机幽默搞笑。通过3轮技术问答涵盖电商高并发场景下的核心技术栈。文末附带详细答案解析帮助小白系统学习。面试场景某电商大厂技术部会议室面试官翻看简历谢飞机是吧看你简历写了3年Java经验今天我们聊聊电商场景下的技术方案。谢飞机紧张地搓手好的好的面试官您请问第一轮基础技术栈考察问题1面试官电商大促期间商品详情页QPS能达到10万你会用Spring Boot怎么优化接口响应速度谢飞机自信满满这个简单加缓存啊Redis缓存商品数据热点数据放本地缓存Caffeine数据库查询用连接池HikariCP优化接口响应能从500ms降到50ms面试官点头不错思路清晰。那缓存击穿怎么处理问题2面试官商品库存扣减场景如何保证并发下的数据一致性谢飞机稍微犹豫额...用分布式锁Redis的Redisson锁或者数据库乐观锁version字段...面试官追问那秒杀场景下10万人同时抢100件商品你的方案能扛住吗谢飞机擦汗这个...可以加消息队列削峰Kafka把请求异步化处理...问题3面试官JVM调优做过吗电商系统GC频繁怎么排查谢飞机眼睛一亮这个我熟用jstat看GC频率jmap看堆内存G1垃圾收集器适合大堆年轻代和老年代比例调整...面试官微笑基础还可以继续。问题4面试官Spring Boot自动装配原理了解吗谢飞机流利回答SpringBootApplication注解包含EnableAutoConfiguration通过spring.factories文件加载自动配置类条件注解Conditional控制加载...面试官满意好第一轮通过。第二轮中间件与微服务问题5面试官订单系统下单后需要通知库存、物流、积分系统怎么设计谢飞机思考片刻用Spring Cloud的事件机制或者...消息队列解耦Kafka发布订单创建事件各系统订阅消费...面试官消息丢失怎么处理谢飞机含糊额...ACK机制重试死信队列问题6面试官用户登录态管理用Session还是JWT为什么谢飞机犹豫微服务架构用JWT好无状态方便横向扩展...但要注意令牌刷新和安全存储...面试官追问JWT被截获了怎么办谢飞机挠头这个...加HTTPS缩短有效期刷新令牌机制问题7面试官Spring Cloud Alibaba的Nacos和Eureka有什么区别谢飞机不太确定Nacos功能更多支持配置中心和服务发现Eureka只做服务发现...具体区别记不清了...面试官记录嗯继续。问题8面试官分布式事务怎么保证下单扣库存和创建订单要同时成功或失败。谢飞机明显紧张SeataTCC模式Saga还是...本地消息表声音越来越小面试官不置可否行最后一轮。第三轮高并发与系统架构问题9面试官双11流量是平时10倍系统如何做容量规划谢飞机努力回忆压测用JMeter做压力测试找出瓶颈然后...扩容限流降级面试官具体怎么限流谢飞机含糊SentinelHystrix令牌桶算法问题10面试官数据库分库分表做过吗什么场景需要分谢飞机擦汗订单表数据量大要分按用户ID哈希分库按时间分表...分片键选择很重要...面试官分表后跨分片查询怎么处理谢飞机声音变小这个...中间件处理或者...业务层聚合问题11面试官系统监控怎么做如何快速定位线上问题谢飞机稍微自信ELK日志系统PrometheusGrafana监控指标SkyWalking链路追踪...告警钉钉通知...面试官点头这个还可以。问题12面试官最后一个问题如果让你设计一个秒杀系统核心架构怎么画谢飞机彻底懵了额...前端限流Redis预减库存Kafka异步下单数据库最终一致性...越说越没底气面试官合上简历好了今天就到这里。谢飞机紧张那...结果怎么样面试官微笑回去等通知吧3个工作日内HR会联系你。谢飞机起身好的好的谢谢面试官答案解析与技术详解问题1Spring Boot接口优化方案业务场景电商商品详情页高并发访问技术方案// 1. 多级缓存架构 Service public class ProductService { Autowired private RedisTemplateString, Object redisTemplate; // 本地缓存 private CacheString, Product localCache Caffeine.newBuilder() .maximumSize(1000) .expireAfterWrite(5, TimeUnit.MINUTES) .build(); public Product getProduct(Long productId) { // L1: 本地缓存 Product product localCache.getIfPresent(productId.toString()); if (product ! null) return product; // L2: Redis缓存 String key product: productId; product (Product) redisTemplate.opsForValue().get(key); if (product ! null) { localCache.put(productId.toString(), product); return product; } // L3: 数据库查询 product productMapper.selectById(productId); redisTemplate.opsForValue().set(key, product, 30, TimeUnit.MINUTES); localCache.put(productId.toString(), product); return product; } }性能提升数据库查询500msRedis查询5ms本地缓存0.5ms整体响应50ms以内问题2库存并发控制方案业务场景秒杀商品库存扣减技术方案// 方案1Redis分布式锁 Autowired private RedissonClient redissonClient; public boolean deductStock(Long productId, Integer quantity) { RLock lock redissonClient.getLock(stock: productId); try { if (lock.tryLock(3, 10, TimeUnit.SECONDS)) { // 检查库存 Integer stock getStockFromRedis(productId); if (stock quantity) { // 扣减库存 redisTemplate.opsForValue().decrement(stock: productId, quantity); // 异步写入数据库 asyncSaveToDB(productId, quantity); return true; } } } catch (InterruptedException e) { Thread.currentThread().interrupt(); } finally { lock.unlock(); } return false; } // 方案2数据库乐观锁 Update(UPDATE product_stock SET stock stock - #{quantity}, version version 1 WHERE product_id #{productId} AND stock #{quantity} AND version #{version}) int deductStockWithOptimisticLock(Param(productId) Long productId, Param(quantity) Integer quantity, Param(version) Integer version);问题3JVM调优实践GC问题排查命令# 查看GC统计 jstat -gcutil pid 1000 # 查看堆内存分布 jmap -heap pid # 导出堆快照分析 jmap -dump:formatb,fileheap.hprof pid # 查看线程状态 jstack pidJVM参数优化-Xms4g -Xmx4g # 堆内存设置 -XX:UseG1GC # G1垃圾收集器 -XX:MaxGCPauseMillis200 # 最大GC停顿时间 -XX:G1HeapRegionSize16m # G1区域大小 -XX:ParallelRefProcEnabled # 并行引用处理 -XX:MetaspaceSize256m # 元空间大小 -Xlog:gc*:filegc.log:time # GC日志问题4Spring Boot自动装配原理核心流程SpringBootApplication包含EnableAutoConfiguration通过Import(AutoConfigurationImportSelector.class)导入配置类读取META-INF/spring.factories文件中的自动配置类通过Conditional系列注解按需加载源码示例Configuration ConditionalOnClass(RedisTemplate.class) EnableConfigurationProperties(RedisProperties.class) public class RedisAutoConfiguration { Bean ConditionalOnMissingBean public RedisTemplateString, Object redisTemplate() { return new RedisTemplate(); } }问题5订单消息通知设计架构设计// 订单创建事件发布 Component public class OrderEventPublisher { Autowired private ApplicationEventPublisher eventPublisher; Autowired private KafkaTemplateString, Object kafkaTemplate; public void publishOrderCreated(Order order) { // 方式1Spring事件机制同进程 eventPublisher.publishEvent(new OrderCreatedEvent(this, order)); // 方式2Kafka消息跨服务 kafkaTemplate.send(order-created-topic, order.getId(), order); } } // 消息可靠性保证配置 Configuration public class KafkaConfig { Bean public ProducerFactoryString, Object producerFactory() { MapString, Object config new HashMap(); config.put(ProducerConfig.ACKS_CONFIG, all); // 所有副本确认 config.put(ProducerConfig.RETRIES_CONFIG, 3); // 重试次数 config.put(ProducerConfig.ENABLE_IDEMPOTENCE_CONFIG, true); // 幂等性 return new DefaultKafkaProducerFactory(config); } }问题6JWT登录态管理JWT工具类实现Component public class JwtTokenProvider { Value(${jwt.secret}) private String jwtSecret; Value(${jwt.expiration}) private long jwtExpiration; public String generateToken(UserDetails userDetails) { Date now new Date(); Date expiryDate new Date(now.getTime() jwtExpiration); return Jwts.builder() .setSubject(userDetails.getUsername()) .setIssuedAt(now) .setExpiration(expiryDate) .signWith(SignatureAlgorithm.HS512, jwtSecret) .compact(); } // 双令牌机制Access Token Refresh Token public RefreshTokenResponse refreshAccessToken(String refreshToken) { // 验证刷新令牌 if (validateToken(refreshToken)) { String username getUsernameFromToken(refreshToken); String newAccessToken generateToken(userDetailsService.loadUserByUsername(username)); return new RefreshTokenResponse(newAccessToken, generateRefreshToken(username)); } throw new InvalidTokenException(刷新令牌无效); } }安全增强措施HTTPS传输加密短有效期15分钟 刷新令牌令牌黑名单机制Redis存储绑定设备指纹/IP地址问题7Nacos vs Eureka对比| 特性 | Nacos | Eureka | |------|-------|--------| | 服务发现 | 支持 | 支持 | | 配置中心 | 支持 | 不支持 | | 一致性协议 | AP/CP可切换 | AP | | 健康检查 | 多种模式 | 心跳 | | 管理界面 | 完善 | 简单 | | 社区活跃度 | 高阿里 | 中Netflix |问题8分布式事务解决方案Seata AT模式示例// 全局事务注解 GlobalTransactional public void createOrder(Order order) { // 1. 扣减库存库存服务 inventoryService.deduct(order.getProductId(), order.getQuantity()); // 2. 创建订单订单服务 orderMapper.insert(order); // 3. 扣减余额账户服务 accountService.deduct(order.getUserId(), order.getAmount()); // 任意一步失败全部回滚 }本地消息表方案Transactional public void createOrderWithMessage(Order order) { // 1. 创建订单 orderMapper.insert(order); // 2. 插入消息记录同一事务 Message message new Message(); message.setOrderId(order.getId()); message.setStatus(PENDING); messageMapper.insert(message); // 3. 定时任务扫描发送消息 }问题9容量规划与限流Sentinel限流配置Configuration public class SentinelConfig { PostConstruct public void initRules() { ListFlowRule rules new ArrayList(); // QPS限流 FlowRule rule new FlowRule(); rule.setResource(createOrder); rule.setGrade(RuleConstant.FLOW_GRADE_QPS); rule.setCount(1000); // 每秒1000请求 rule.setLimitApp(default); rules.add(rule); FlowRuleManager.loadRules(rules); } } // 降级处理 SentinelResource(value createOrder, fallback createOrderFallback) public Order createOrder(OrderDTO dto) { return orderService.create(dto); } public Order createOrderFallback(OrderDTO dto, Throwable ex) { // 返回友好提示或排队中状态 return Order.buildWaitingOrder(dto); }问题10数据库分库分表ShardingSphere配置shardingSphere: sharding: tables: t_order: actualDataNodes: ds${0..1}.t_order${0..3} tableStrategy: inline: shardingColumn: order_id algorithmExpression: t_order${order_id % 4} databaseStrategy: inline: shardingColumn: user_id algorithmExpression: ds${user_id % 2}跨分片查询方案业务层聚合应用层合并结果搜索引擎Elasticsearch数据同步到宽表避免跨分片查询业务设计优化问题11系统监控体系PrometheusGrafana监控# Spring Boot Actuator配置 management: endpoints: web: exposure: include: health,info,metrics,prometheus metrics: export: prometheus: enabled: true关键监控指标JVM堆内存、GC次数、线程数应用QPS、响应时间、错误率中间件Redis连接数、Kafka积压量数据库连接池、慢查询、锁等待ELK日志查询示例{ query: { bool: { must: [ { match: { level: ERROR }}, { range: { timestamp: { gte: now-1h }}} ] } } }问题12秒杀系统架构设计核心架构图用户请求 → CDN静态资源 → 网关限流 → Redis预减库存 → Kafka异步下单 → 数据库持久化 ↑ ↑ ↑ ↑ ↑ 前端拦截 Sentinel 分布式锁 消息队列 分库分表关键代码// Redis预减库存 public boolean preDeductStock(Long productId) { String key seckill:stock: productId; Long stock redisTemplate.opsForValue().decrement(key); if (stock 0) { redisTemplate.opsForValue().increment(key); // 回滚 return false; } return true; } // 异步下单 KafkaListener(topics seckill-order-topic) public void handleSeckillOrder(SeckillOrder order) { try { // 创建订单 orderService.create(order); // 扣减真实库存 inventoryService.deduct(order.getProductId(), 1); } catch (Exception e) { // 失败补偿恢复库存 redisTemplate.opsForValue().increment(seckill:stock: order.getProductId()); } }面试总结谢飞机表现评估✅ 基础技术扎实Spring Boot、JVM、缓存✅ 中间件有了解Redis、Kafka、监控⚠️ 复杂场景经验不足分布式事务、分库分表⚠️ 架构设计能力待提升秒杀系统给求职者的建议深入理解技术原理不要只停留在使用层面多做高并发场景的实战项目建立完整的技术知识体系培养系统性架构思维结语面试是双向选择技术成长是持续过程。希望本文能帮助各位求职者在技术面试中游刃有余觉得有用请点赞收藏有问题欢迎评论区交流
Java大厂面试实录:电商高并发场景下的Spring Boot+Redis+Kafka技术栈深度解析
Java大厂面试实录电商高并发场景下的技术栈深度解析前言本文记录了一场真实的互联网大厂Java技术面试面试官严肃专业求职者谢飞机幽默搞笑。通过3轮技术问答涵盖电商高并发场景下的核心技术栈。文末附带详细答案解析帮助小白系统学习。面试场景某电商大厂技术部会议室面试官翻看简历谢飞机是吧看你简历写了3年Java经验今天我们聊聊电商场景下的技术方案。谢飞机紧张地搓手好的好的面试官您请问第一轮基础技术栈考察问题1面试官电商大促期间商品详情页QPS能达到10万你会用Spring Boot怎么优化接口响应速度谢飞机自信满满这个简单加缓存啊Redis缓存商品数据热点数据放本地缓存Caffeine数据库查询用连接池HikariCP优化接口响应能从500ms降到50ms面试官点头不错思路清晰。那缓存击穿怎么处理问题2面试官商品库存扣减场景如何保证并发下的数据一致性谢飞机稍微犹豫额...用分布式锁Redis的Redisson锁或者数据库乐观锁version字段...面试官追问那秒杀场景下10万人同时抢100件商品你的方案能扛住吗谢飞机擦汗这个...可以加消息队列削峰Kafka把请求异步化处理...问题3面试官JVM调优做过吗电商系统GC频繁怎么排查谢飞机眼睛一亮这个我熟用jstat看GC频率jmap看堆内存G1垃圾收集器适合大堆年轻代和老年代比例调整...面试官微笑基础还可以继续。问题4面试官Spring Boot自动装配原理了解吗谢飞机流利回答SpringBootApplication注解包含EnableAutoConfiguration通过spring.factories文件加载自动配置类条件注解Conditional控制加载...面试官满意好第一轮通过。第二轮中间件与微服务问题5面试官订单系统下单后需要通知库存、物流、积分系统怎么设计谢飞机思考片刻用Spring Cloud的事件机制或者...消息队列解耦Kafka发布订单创建事件各系统订阅消费...面试官消息丢失怎么处理谢飞机含糊额...ACK机制重试死信队列问题6面试官用户登录态管理用Session还是JWT为什么谢飞机犹豫微服务架构用JWT好无状态方便横向扩展...但要注意令牌刷新和安全存储...面试官追问JWT被截获了怎么办谢飞机挠头这个...加HTTPS缩短有效期刷新令牌机制问题7面试官Spring Cloud Alibaba的Nacos和Eureka有什么区别谢飞机不太确定Nacos功能更多支持配置中心和服务发现Eureka只做服务发现...具体区别记不清了...面试官记录嗯继续。问题8面试官分布式事务怎么保证下单扣库存和创建订单要同时成功或失败。谢飞机明显紧张SeataTCC模式Saga还是...本地消息表声音越来越小面试官不置可否行最后一轮。第三轮高并发与系统架构问题9面试官双11流量是平时10倍系统如何做容量规划谢飞机努力回忆压测用JMeter做压力测试找出瓶颈然后...扩容限流降级面试官具体怎么限流谢飞机含糊SentinelHystrix令牌桶算法问题10面试官数据库分库分表做过吗什么场景需要分谢飞机擦汗订单表数据量大要分按用户ID哈希分库按时间分表...分片键选择很重要...面试官分表后跨分片查询怎么处理谢飞机声音变小这个...中间件处理或者...业务层聚合问题11面试官系统监控怎么做如何快速定位线上问题谢飞机稍微自信ELK日志系统PrometheusGrafana监控指标SkyWalking链路追踪...告警钉钉通知...面试官点头这个还可以。问题12面试官最后一个问题如果让你设计一个秒杀系统核心架构怎么画谢飞机彻底懵了额...前端限流Redis预减库存Kafka异步下单数据库最终一致性...越说越没底气面试官合上简历好了今天就到这里。谢飞机紧张那...结果怎么样面试官微笑回去等通知吧3个工作日内HR会联系你。谢飞机起身好的好的谢谢面试官答案解析与技术详解问题1Spring Boot接口优化方案业务场景电商商品详情页高并发访问技术方案// 1. 多级缓存架构 Service public class ProductService { Autowired private RedisTemplateString, Object redisTemplate; // 本地缓存 private CacheString, Product localCache Caffeine.newBuilder() .maximumSize(1000) .expireAfterWrite(5, TimeUnit.MINUTES) .build(); public Product getProduct(Long productId) { // L1: 本地缓存 Product product localCache.getIfPresent(productId.toString()); if (product ! null) return product; // L2: Redis缓存 String key product: productId; product (Product) redisTemplate.opsForValue().get(key); if (product ! null) { localCache.put(productId.toString(), product); return product; } // L3: 数据库查询 product productMapper.selectById(productId); redisTemplate.opsForValue().set(key, product, 30, TimeUnit.MINUTES); localCache.put(productId.toString(), product); return product; } }性能提升数据库查询500msRedis查询5ms本地缓存0.5ms整体响应50ms以内问题2库存并发控制方案业务场景秒杀商品库存扣减技术方案// 方案1Redis分布式锁 Autowired private RedissonClient redissonClient; public boolean deductStock(Long productId, Integer quantity) { RLock lock redissonClient.getLock(stock: productId); try { if (lock.tryLock(3, 10, TimeUnit.SECONDS)) { // 检查库存 Integer stock getStockFromRedis(productId); if (stock quantity) { // 扣减库存 redisTemplate.opsForValue().decrement(stock: productId, quantity); // 异步写入数据库 asyncSaveToDB(productId, quantity); return true; } } } catch (InterruptedException e) { Thread.currentThread().interrupt(); } finally { lock.unlock(); } return false; } // 方案2数据库乐观锁 Update(UPDATE product_stock SET stock stock - #{quantity}, version version 1 WHERE product_id #{productId} AND stock #{quantity} AND version #{version}) int deductStockWithOptimisticLock(Param(productId) Long productId, Param(quantity) Integer quantity, Param(version) Integer version);问题3JVM调优实践GC问题排查命令# 查看GC统计 jstat -gcutil pid 1000 # 查看堆内存分布 jmap -heap pid # 导出堆快照分析 jmap -dump:formatb,fileheap.hprof pid # 查看线程状态 jstack pidJVM参数优化-Xms4g -Xmx4g # 堆内存设置 -XX:UseG1GC # G1垃圾收集器 -XX:MaxGCPauseMillis200 # 最大GC停顿时间 -XX:G1HeapRegionSize16m # G1区域大小 -XX:ParallelRefProcEnabled # 并行引用处理 -XX:MetaspaceSize256m # 元空间大小 -Xlog:gc*:filegc.log:time # GC日志问题4Spring Boot自动装配原理核心流程SpringBootApplication包含EnableAutoConfiguration通过Import(AutoConfigurationImportSelector.class)导入配置类读取META-INF/spring.factories文件中的自动配置类通过Conditional系列注解按需加载源码示例Configuration ConditionalOnClass(RedisTemplate.class) EnableConfigurationProperties(RedisProperties.class) public class RedisAutoConfiguration { Bean ConditionalOnMissingBean public RedisTemplateString, Object redisTemplate() { return new RedisTemplate(); } }问题5订单消息通知设计架构设计// 订单创建事件发布 Component public class OrderEventPublisher { Autowired private ApplicationEventPublisher eventPublisher; Autowired private KafkaTemplateString, Object kafkaTemplate; public void publishOrderCreated(Order order) { // 方式1Spring事件机制同进程 eventPublisher.publishEvent(new OrderCreatedEvent(this, order)); // 方式2Kafka消息跨服务 kafkaTemplate.send(order-created-topic, order.getId(), order); } } // 消息可靠性保证配置 Configuration public class KafkaConfig { Bean public ProducerFactoryString, Object producerFactory() { MapString, Object config new HashMap(); config.put(ProducerConfig.ACKS_CONFIG, all); // 所有副本确认 config.put(ProducerConfig.RETRIES_CONFIG, 3); // 重试次数 config.put(ProducerConfig.ENABLE_IDEMPOTENCE_CONFIG, true); // 幂等性 return new DefaultKafkaProducerFactory(config); } }问题6JWT登录态管理JWT工具类实现Component public class JwtTokenProvider { Value(${jwt.secret}) private String jwtSecret; Value(${jwt.expiration}) private long jwtExpiration; public String generateToken(UserDetails userDetails) { Date now new Date(); Date expiryDate new Date(now.getTime() jwtExpiration); return Jwts.builder() .setSubject(userDetails.getUsername()) .setIssuedAt(now) .setExpiration(expiryDate) .signWith(SignatureAlgorithm.HS512, jwtSecret) .compact(); } // 双令牌机制Access Token Refresh Token public RefreshTokenResponse refreshAccessToken(String refreshToken) { // 验证刷新令牌 if (validateToken(refreshToken)) { String username getUsernameFromToken(refreshToken); String newAccessToken generateToken(userDetailsService.loadUserByUsername(username)); return new RefreshTokenResponse(newAccessToken, generateRefreshToken(username)); } throw new InvalidTokenException(刷新令牌无效); } }安全增强措施HTTPS传输加密短有效期15分钟 刷新令牌令牌黑名单机制Redis存储绑定设备指纹/IP地址问题7Nacos vs Eureka对比| 特性 | Nacos | Eureka | |------|-------|--------| | 服务发现 | 支持 | 支持 | | 配置中心 | 支持 | 不支持 | | 一致性协议 | AP/CP可切换 | AP | | 健康检查 | 多种模式 | 心跳 | | 管理界面 | 完善 | 简单 | | 社区活跃度 | 高阿里 | 中Netflix |问题8分布式事务解决方案Seata AT模式示例// 全局事务注解 GlobalTransactional public void createOrder(Order order) { // 1. 扣减库存库存服务 inventoryService.deduct(order.getProductId(), order.getQuantity()); // 2. 创建订单订单服务 orderMapper.insert(order); // 3. 扣减余额账户服务 accountService.deduct(order.getUserId(), order.getAmount()); // 任意一步失败全部回滚 }本地消息表方案Transactional public void createOrderWithMessage(Order order) { // 1. 创建订单 orderMapper.insert(order); // 2. 插入消息记录同一事务 Message message new Message(); message.setOrderId(order.getId()); message.setStatus(PENDING); messageMapper.insert(message); // 3. 定时任务扫描发送消息 }问题9容量规划与限流Sentinel限流配置Configuration public class SentinelConfig { PostConstruct public void initRules() { ListFlowRule rules new ArrayList(); // QPS限流 FlowRule rule new FlowRule(); rule.setResource(createOrder); rule.setGrade(RuleConstant.FLOW_GRADE_QPS); rule.setCount(1000); // 每秒1000请求 rule.setLimitApp(default); rules.add(rule); FlowRuleManager.loadRules(rules); } } // 降级处理 SentinelResource(value createOrder, fallback createOrderFallback) public Order createOrder(OrderDTO dto) { return orderService.create(dto); } public Order createOrderFallback(OrderDTO dto, Throwable ex) { // 返回友好提示或排队中状态 return Order.buildWaitingOrder(dto); }问题10数据库分库分表ShardingSphere配置shardingSphere: sharding: tables: t_order: actualDataNodes: ds${0..1}.t_order${0..3} tableStrategy: inline: shardingColumn: order_id algorithmExpression: t_order${order_id % 4} databaseStrategy: inline: shardingColumn: user_id algorithmExpression: ds${user_id % 2}跨分片查询方案业务层聚合应用层合并结果搜索引擎Elasticsearch数据同步到宽表避免跨分片查询业务设计优化问题11系统监控体系PrometheusGrafana监控# Spring Boot Actuator配置 management: endpoints: web: exposure: include: health,info,metrics,prometheus metrics: export: prometheus: enabled: true关键监控指标JVM堆内存、GC次数、线程数应用QPS、响应时间、错误率中间件Redis连接数、Kafka积压量数据库连接池、慢查询、锁等待ELK日志查询示例{ query: { bool: { must: [ { match: { level: ERROR }}, { range: { timestamp: { gte: now-1h }}} ] } } }问题12秒杀系统架构设计核心架构图用户请求 → CDN静态资源 → 网关限流 → Redis预减库存 → Kafka异步下单 → 数据库持久化 ↑ ↑ ↑ ↑ ↑ 前端拦截 Sentinel 分布式锁 消息队列 分库分表关键代码// Redis预减库存 public boolean preDeductStock(Long productId) { String key seckill:stock: productId; Long stock redisTemplate.opsForValue().decrement(key); if (stock 0) { redisTemplate.opsForValue().increment(key); // 回滚 return false; } return true; } // 异步下单 KafkaListener(topics seckill-order-topic) public void handleSeckillOrder(SeckillOrder order) { try { // 创建订单 orderService.create(order); // 扣减真实库存 inventoryService.deduct(order.getProductId(), 1); } catch (Exception e) { // 失败补偿恢复库存 redisTemplate.opsForValue().increment(seckill:stock: order.getProductId()); } }面试总结谢飞机表现评估✅ 基础技术扎实Spring Boot、JVM、缓存✅ 中间件有了解Redis、Kafka、监控⚠️ 复杂场景经验不足分布式事务、分库分表⚠️ 架构设计能力待提升秒杀系统给求职者的建议深入理解技术原理不要只停留在使用层面多做高并发场景的实战项目建立完整的技术知识体系培养系统性架构思维结语面试是双向选择技术成长是持续过程。希望本文能帮助各位求职者在技术面试中游刃有余觉得有用请点赞收藏有问题欢迎评论区交流