Appearance
高并发设计
高并发面试主线:缓存 → 异步 → 分片 → 限流。核心思想是"分而治之"。
Q1: 高并发系统的常见优化手段? 「🟡 中级」
考察点:系统性思维。
参考答案:
- 缓存:多级缓存(本地 + Redis)、热点数据预加载、缓存穿透/击穿/雪崩防护。
- 异步:消息队列削峰、异步处理非核心逻辑。
- 分片:分库分表、读写分离、CDN 静态化。
- 限流:令牌桶/滑动窗口、熔断降级。
- 水平扩展:无状态服务 + 负载均衡。
- 数据库优化:索引优化、连接池、批量操作。
追问延伸:
- 这些手段的优先级怎么排?
- 什么阶段该用什么手段?
Q2: 缓存的常见策略和设计? 「🟡 中级」
考察点:缓存是高并发的第一道防线。
参考答案:
- Cache Aside:先更新 DB,再删除缓存(主流)。
- Read/Write Through:应用只和缓存交互,缓存负责同步 DB。
- Write Behind(Write Back):只更新缓存,异步批量写 DB(高性能但可能丢数据)。
- 多级缓存:本地缓存(Caffeine/Guava)→ 分布式缓存(Redis)→ DB。
- 热点数据:永不过期 + 逻辑过期(后台异步更新)。
追问延伸:
- 缓存和数据库一致性怎么保证?
- 热点 key 怎么发现和处理?
Q3: 分库分表后怎么处理跨库查询? 「🔴 高级」
考察点:分片后的架构难题。
参考答案:
- 应用层组装:分别查询各分片,应用层合并(适合简单场景)。
- 宽表冗余:把关联数据冗余到同一分片(适合读多写少)。
- ES/ClickHouse:把数据同步到搜索引擎/OLAP 引擎做复杂查询。
- 全局索引表:维护一张索引表记录数据所在分片(适合按非分片键查询)。
追问延伸:
- 分片键怎么选?
- 跨分片的分布式 JOIN 怎么优化?
Q4: 消息队列怎么削峰? 「🟡 中级」
考察点:异步解耦的核心价值。
参考答案:
- 突发流量先写入 MQ,消费端按自身能力慢慢消费。
- 关键配置:MQ 的容量要足够大(Kafka 天然支持海量堆积);消费端并发度要可调。
- 配合限流:消费端加限流,避免打垮下游。
- 监控:积压告警、消费延迟监控。
追问延伸:
- 削峰时怎么保证不丢消息?
- 消费能力跟不上怎么动态扩容?
Q5: 秒杀系统怎么设计? 「🔴 高级」
考察点:经典高并发场景综合题。
参考答案:
- 前端:按钮置灰、验证码、静态资源 CDN。
- 网关层:限流(令牌桶)、IP 黑名单、风控拦截。
- 服务层:库存预扣减(Redis Lua 原子操作)、异步下单(MQ 削峰)、一人一单校验。
- 数据层:库存分片、热点库存隔离。
- 兜底:降级页面、排队机制。
追问延伸:
- Redis 预扣减库存怎么保证原子性?
- 超卖问题怎么防止?
Q6: 怎么设计一个高可用的系统? 「🔴 高级」
考察点:系统可靠性设计的综合能力。
参考答案:
- 冗余:多实例部署、多机房容灾。
- 隔离:业务隔离(核心/非核心分开)、资源隔离(线程池隔离)。
- 限流降级:快速失败、兜底数据。
- 数据一致性:最终一致性 + 补偿机制。
- 监控告警:全链路监控、异常自动告警。
- 演练:混沌工程、故障注入。
追问延伸:
- 多活架构有哪几种模式?
- 怎么做到 RTO=0、RPO=0?