Skip to content

高并发设计

高并发面试主线:缓存 → 异步 → 分片 → 限流。核心思想是"分而治之"。

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?