面试故事:大型互联网公司Java后端面试(涵盖Spring Boot、微服务、Kafka、Redis、JPA等技术点)
面试故事:大型互联网公司Java后端面试(涵盖Spring Boot、微服务、Kafka、Redis、JPA等技术点)
场景:一家互联网大厂的后端面试,业务方向为内容社区与UGC(用户生成内容),需要处理高并发写入、搜索与推荐、消息通知和异步处理,系统使用微服务架构、Kafka消息队列、Redis缓存、Spring Boot生态与JPA/MyBatis等。
人物设定
面试官:严肃专业,关注架构设计、性能、可观测性与安全。
面试者:燕双非——一个有一定经验但喜欢偷懒和讲笑话的程序员,面对简单题能答出,复杂题回答含糊。
第一轮(基础与架构)
面试官:请介绍一下你们系统的总体架构,从接入到数据持久化的流转?(问题1)
燕双非:我们用Nginx做负载,前端调用Spring Boot服务,服务写入MySQL,重要业务发Kafka异步处理,Redis做缓存。面试官点头并追问细节。
面试官:在高并发场景下,如何保证写入MySQL的性能与可用性?(问题2)
燕双非:用连接池、主从读写分离、分库分表、批量插入、索引优化。面试官补充并引导讨论事务、乐观锁与悲观锁。
面试官:如果要做用户生成内容(UGC)的防刷与风控,你会采用哪些技术手段?(问题3)
燕双非:限流、验证码、IP黑名单、频率统计。面试官进一步问到如何实现限流(Redis、令牌桶、漏桶)与异地多机限流一致性问题。
第二轮(微服务与消息)
面试官:某个功能需要异步处理图片审核与生成缩略图,如何设计微服务交互与消息可靠性?(问题4)
燕双非:上传后发Kafka消息,审核服务消费,处理完写状态。面试官让其说明Kafka的至少一次与幂等性设计。
面试官:假如Kafka消息重复消费或消息丢失,你如何保证数据一致性?(问题5)
燕双非(含糊):可以做幂等,消费端检查数据库状态。面试官追问幂等具体实现(去重表、分布式ID、事务日志、exactly-once语义)并讲解事务补偿与Outbox模式。
面试官:微服务之间如何进行服务发现与调用,如何保护远程调用的稳定性?(问题6)
燕双非:我们用Spring Cloud Eureka和OpenFeign,熔断器用Resilience4j。面试官进一步检查熔断器、限流、重试策略与断路器状态机。
第三轮(存储、缓存与监控安全)
面试官:你们用Redis做缓存,缓存穿透、雪崩和击穿怎么解决?(问题7)
燕双非:用布隆过滤器、防穿透缓存空结果、加随机过期、互斥锁或双重检测锁。面试官要求给出代码或伪代码说明。
面试官:如何为整个系统做链路追踪与性能监控?(问题8)
燕双非:用Prometheus + Grafana监控指标,用Jaeger/Zipkin做分布式追踪,埋点要在入口、RPC、DB与关键业务节点。面试官补充采样策略与存储成本考虑。
面试官:系统在公开API上需要鉴权与防护,你会如何设计认证与授权?(问题9)
燕双非(有点模糊):用JWT和OAuth2,重要接口加权限校验。面试官深入问到Token的刷新、撤销、密钥轮换和防止CSRF等细节。
结尾
面试官:今天就到这里,你先回去等消息。
燕双非:太好了,我走了!
面试答案详解(按问题编号)
问题1:系统总体架构说明
业务场景:UGC内容社区,需要处理图文视频的上传、存储、审核、搜索与推荐,同时保证高并发与较低延迟。
技术点:
- 接入层:Nginx/负载均衡 + CDN 对静态资源加速。
- 网关与认证:API Gateway(如Spring Cloud Gateway)做统一认证、限流与路由。
- 应用层:Spring Boot 微服务,分业务域(用户、内容、审核、通知、搜索、推荐)。
- 异步与消息:Kafka/RabbitMQ 负责异步任务(通知、审核、数据流转)。
- 存储:MySQL 做关系数据,Elasticsearch 做搜索,对象存储(如MinIO/S3)存放媒体。
- 缓存:Redis 做缓存与短期计数。
- 可观测性:Prometheus + Grafana、ELK、Jaeger。
问题2:高并发下MySQL性能优化
- 连接池(HikariCP)减少连接开销。
- 读写分离:主库负责写,多个从库负责读。
- 分库分表:按业务或时间分片,减少单表压力。
- 索引优化:覆盖索引、避免全表扫描,监控慢查询并优化。
- 批量操作:批量插入/更新,减少事务数。
- 事务隔离与锁:尽量缩短事务时间,使用乐观锁(版本号)避免长锁。
- 使用缓存、异步化与消息化削峰。
问题3:UGC防刷与风控策略
- 限流:令牌桶/漏桶在API网关或Redis实现计数(Sliding Window、Fixed Window、Leaky Bucket)。
- 频率统计:使用Redis计数器或HyperLogLog做去重统计。
- 验证码与短信验证、设备指纹、IP与行为黑名单。
- 机器学习/规则引擎做异常行为检测(例如短时间内大量发布相似内容)。
- 对重要操作做人工审核或灰度发布。
问题4:异步图片审核的微服务设计
- 上传流程:前端上传到对象存储(或后端代理上传),后端写状态并发送Kafka消息(事件驱动)。
- 消费者:审核服务订阅Kafka,拉取消息处理(调用AI/外包审核),处理后更新DB状态并发送下游事件(例如通知)。
- 设计要点:消息格式与schema兼容、使用主题与分区实现并行、分区键选择与消费幂等。
问题5:Kafka的重复消费与消息丢失防护
- 消费幂等性:在消费端使用去重表(记录消息ID)或幂等写操作(利用唯一约束)。
- 事务与Outbox模式:写业务DB和Outbox表在同一事务,然后独立的发布器把Outbox消息写入Kafka,保证不丢失。
- Exactly-once:使用Kafka事务(Producer Transaction)和幂等Producer,结合幂等消费尽量保证语义。
- 补偿机制:保持消息重试、死信队列(DLQ)与人工处理流程。
问题6:服务发现、调用与稳定性保护
- 服务发现:Eureka/Consul/Kubernetes DNS。
- 远程调用:OpenFeign/RestTemplate/WebClient/gRPC。
- 稳定性:重试、指数退避、断路器(Resilience4j/Hystrix),限流、隔离线程池或信号量。
- 监控与熔断:监控错误率与延迟,动态调整熔断阈值。
问题7:Redis缓存穿透/击穿/雪崩解决方案
- 缓存穿透:使用布隆过滤器或校验参数;对空结果缓存短时空值。
- 缓存击穿:对热点Key使用互斥锁(Redis SETNX)、双重检查或提前缓存续期。
- 缓存雪崩:加随机过期、缓存预热、多级缓存与降级策略。
- 示例伪代码:互斥锁 + DB回源逻辑(略)。
问题8:链路追踪与监控设计
- 指标:应用、JVM、HTTP、DB、消息队列等关键指标上报到Prometheus。
- 可视化:Grafana仪表盘监控QPS、延迟、错误率。
- 链路追踪:采用OpenTelemetry/Jaeger/Zipkin埋点,传递TraceId、SpanId并控制采样率。
- 日志:结构化日志上报到ELK/EFK,结合Tracing实现错误定位。
问题9:鉴权与授权设计细节
- 认证:OAuth2 + JWT 或使用Keycloak等IAM系统。
- JWT注意点:短期有效、Refresh Token机制、签名密钥轮换、验证黑名单(登出/撤销)。
- 授权:基于角色/权限的访问控制(RBAC),重要操作做二次校验。
- 安全实践:HTTPS、CSRF防护、输入校验、速率限制、敏感数据加密与密钥管理(Bouncy Castle/HSM)。
—— 文章结束 ——
更多推荐

所有评论(0)