面试指南

高并发与高可用

面试权重:★★★ | 适用级别:P7/P8+ | 预计复习时间:1-2周

概览

面试权重:★★★ | 适用级别:P7/P8+ | 预计复习时间:1-2周

这一章不仅考“会不会缓存、限流、熔断”,更考“如何从零到一设计一个高并发系统,以及如何随着业务增长做架构演进”。

建议用法

先把正文里的“设计起手式、分层框架、稳定性组件、典型场景”串成一条完整回答链,再用后面的高频题做 30 秒口述训练。讲不顺时,优先回看对应正文,而不是继续堆题。

一、知识体系

1. 从零到一设计高并发系统 ★★★

1.1 设计起手式:先问目标,再谈技术 ★★★

  • 核心结论
    • 高并发题最容易失分的地方,不是方案不够花,而是没有先把业务目标、峰值流量、SLA 和成本约束讲清楚。
    • 高级岗面试官通常先听你如何定义问题,再看你如何选技术,而不是反过来。
  • 先澄清
    • 核心业务链路是什么,哪一步最不能失败
    • 峰值 QPS、日请求量、读写比例、峰值持续多久
    • TP99、可用性、成本预算目标
    • 是否允许排队、降级、最终一致
  • 原理展开
    • 技术方案永远是约束驱动的。比如同样是下单链路,如果要求强一致、秒级回执、预算充足,方案会明显不同于“允许异步、允许降级、追求低成本”的场景。
    • 先问清“并发打在哪里”,才能决定是先挡入口、先拦数据库,还是先处理下游依赖抖动。
  • 面试怎么答
    • “我会先把题目收敛成四个输入:业务主链路、峰值流量、SLA 目标、成本和一致性边界。输入没定,后面的缓存、MQ、分库分表都只是空谈。”
  • 易错点
    • 一上来就说 Redis、MQ、分库分表,面试官通常会继续追问“为什么一定需要”。
  • 面试表达顺序建议
    1. 需求和约束
    2. 容量估算
    3. 高层架构
    4. 核心链路
    5. 稳定性与演进

1.2 容量规划与压测 ★★★

  • 核心结论
    • 容量规划不是算一个平均值,而是确定“系统在哪个量级开始不安全”,并为峰值和故障转移预留缓冲。
  • 容量估算
    • 并发数 ≈ QPS × 平均 RT
    • 先估入口流量,再估数据库、缓存、MQ、下游服务
    • 峰值容量要结合活动系数和冗余系数
  • 压测怎么看才有价值
  • 压测方法
    • 基准压测:单接口、单依赖、单机能力
    • 链路压测:核心下单、支付、查询链路
    • 全链路压测:入口到存储的端到端验证
  • 重点观察
    • TP99、错误率、CPU、GC、线程池队列、Redis 命中率、DB 慢查询、MQ 积压
  • 原理展开
    • 真正有用的压测结果,一定能回答两个问题:当前主瓶颈在哪一层,以及扩容后是否还能线性提升。
    • 如果单机 CPU 很空,但 TP99 仍然抖动,问题往往不在应用本身,而在数据库、网络、线程池排队或 GC。
  • 面试怎么答
    • “我会先做容量估算,再用基准压测和链路压测验证。压测不是为了拿一个极限 QPS,而是为了定位瓶颈层级和安全水位。”
  • 易错点
    • 只报平均 RT,不报 TP99、错误率和资源水位,结论通常不可信。

1.3 分层设计框架 ★★★

  • 核心结论
    • 高并发系统不是靠某一个中间件扛住,而是靠分层过滤流量,把真正贵的请求拦在尽量靠前的位置。
  • 接入层
    • CDN、Nginx、Gateway、WAF、限流、验证码、流量预热
  • 服务层
    • 无状态部署、池化、批处理、并行调用、超时预算、隔离舱
  • 缓存层
    • JVM 本地缓存 + Redis + CDN,多级缓存协同
  • 异步层
    • MQ 削峰、异步下单、延迟任务、补偿任务
  • 数据层
    • MySQL、读写分离、冷热分离、分库分表、索引优化
  • 治理层
    • 监控告警、链路追踪、开关、灰度、回滚、应急预案
  • 原理展开
    • 接入层解决“无效流量太多”,缓存层解决“热点读太贵”,异步层解决“峰值写太尖”,治理层解决“故障时能不能稳住并快速回滚”。
    • 高级岗要能把这些层之间的职责边界说清楚,而不是把所有问题都交给 Redis 或 MQ。
  • 面试怎么答
    • “我的思路是分层消峰:入口先拦无效流量,缓存层先吃热点读,异步层把高峰写拉平,最后才让数据库承接核心状态。”

1.4 演进路线:按瓶颈逐步升级 ★★★

  • 常见演进路径
    • 单机应用
    • 多副本 + 负载均衡
    • 缓存 + 限流 + 异步
    • 服务拆分
    • 分库分表 + 多级缓存
    • 同城双活 / 异地多活
  • 原则
    • 先解决当前主瓶颈
    • 避免一开始就把分布式复杂度拉满
  • 面试怎么答
    • “我倾向阶段化演进。先用最小复杂度跑通主链路,等热点、单表、跨服务调用这些真实瓶颈出现,再逐步引入缓存、异步、拆分和容灾。”
  • 易错点
    • 用未来三年的假设规模,为当前系统一次性付清全部复杂度成本。

1.5 常见瓶颈与治理思路 ★★★

  • 数据库顶不住
    • 缓存、读写分离、批量化、分片、异步化
  • Redis 热点或大 Key
    • 本地缓存、Key 打散、集群扩容、对象压缩
  • MQ 积压
    • 扩容消费者、提升并发、临时旁路、降级非核心链路
  • 下游接口不稳定
    • 超时、重试、熔断、降级、隔离
  • 突发流量打爆入口
    • 排队、令牌桶、活动预热、静态化、验证码/风控
  • 面试怎么答
    • “我不会只给一个通用答案,而是先判断瓶颈位置。DB 不行就先减少落库次数,Redis 不行就先处理热点和大 Key,下游抖动就优先做超时、熔断和隔离。”

2. 高并发设计 ★★★

2.1 缓存策略 ★★★

  • 核心结论
    • 缓存的第一目标是减少高频读对数据库的直接冲击,第二目标才是降延迟。
  • 多级缓存架构
    • L1:JVM 本地缓存(Caffeine/Guava Cache)
    • L2:分布式缓存(Redis)
    • L3:CDN / Nginx 缓存
  • 缓存模式
    • Cache Aside(旁路缓存)★★★:最常用,业务可控性最好
    • Read Through / Write Through
    • Write Behind(异步写回)
  • 缓存设计的面试重点
  • 原理展开
    • 本地缓存擅长拦极热点,Redis 擅长跨实例共享,CDN 擅长把静态或弱动态流量挡在源站外。
    • 真正常见问题不是“要不要上缓存”,而是缓存穿透、击穿、雪崩和一致性如何控制。
  • 缓存一致性(详见中间件篇 Redis 部分)
  • 热点数据发现与本地缓存
  • 面试怎么答
    • “我会优先用 Cache Aside 做主模式,再按热点程度叠加本地缓存。核心不是只讲命中率,而是讲清失效策略、回源保护和一致性容忍度。”
  • 易错点
    • 把所有数据都塞进 Redis,而不区分热点、更新频率和容错边界。

2.2 异步化 ★★★

  • 核心结论
    • 异步化的价值在于把用户请求链路里的非核心步骤移出同步路径,换取更稳的 RT 和更高的吞吐。
  • 消息队列异步解耦
  • CompletableFuture 异步编排
  • 事件驱动架构(EDA)
  • 线程池异步处理
  • 异步的代价
    • 一致性问题、排查复杂、链路更长
  • 原理展开
    • 适合异步的通常是通知、积分、日志、画像更新这类可延后动作;不适合异步的是“请求一返回就必须对用户可见”的核心交易状态。
  • 面试怎么答
    • “异步不是默认更高级,而是用同步确定核心状态,用异步延后非关键动作。每引入一次异步,就必须补上重试、幂等、补偿和监控。”
  • 易错点
    • 为了追求吞吐,把关键一致性步骤也异步化,最后靠人工补偿兜底。

2.3 池化技术 ★★

  • 核心结论
    • 池化的本质是复用昂贵资源,减少反复创建销毁的成本,但前提是边界清晰、容量可控。
  • 线程池(ThreadPoolExecutor)
  • 连接池(HikariCP/Druid)
  • 对象池(Apache Commons Pool)
  • 池化参数调优
  • 面试怎么答
    • “线程池重点看队列长度、拒绝策略和上下游超时匹配;连接池重点看连接创建成本、最大连接数和数据库承受上限。”
  • 易错点
    • 线程池和连接池都不是越大越好,配置过大只会把问题延后到更深层的依赖。

2.4 数据库层优化 ★★★

  • 核心结论
    • 高并发系统最终还是要回到数据库,因为核心状态要落地。前面所有优化,本质上都是为了减少数据库被无效或不必要请求打爆。
  • 读写分离
  • 分库分表(详见数据库篇)
  • 数据冷热分离
  • 查询优化与索引优化
  • 数据库连接池配置
  • 原理展开
    • 先优化 SQL 和索引,再谈分片;先判断热点表和热点行,再决定拆法;先确认是否真的是数据库瓶颈,再决定是否加一层缓存。
  • 面试怎么答
    • “数据库优化我会按顺序做:慢 SQL 和索引治理、连接池和事务边界优化、读写分离、再考虑分库分表。分片是最后手段,不是起手式。”

2.5 接口性能优化 ★★★

  • 减少 IO 次数:批量操作、Pipeline
  • 减少序列化开销:Protobuf > JSON > XML
  • 减少网络往返:合并请求、本地缓存
  • 并行调用:CompletableFuture 并行调用多个下游
  • 数据压缩:gzip / snappy
  • 惰性加载与按需查询
  • 面试怎么答
    • “接口优化优先看调用链里最贵的远程 IO,再决定是合并、并行、缓存还是异步。只有在 IO 成本降下来后,序列化和压缩优化才真正有意义。”

3. 高可用设计 ★★★

3.1 限流 ★★★

  • 核心结论
    • 限流不是简单拒绝请求,而是在系统承载边界内,优先保住核心链路。
  • 限流算法
    • 固定窗口:简单但有边界突发问题
    • 滑动窗口:精确但内存开销大
    • 漏桶(Leaky Bucket):匀速输出
    • 令牌桶(Token Bucket):允许突发 ★★★
  • 限流粒度
    • 接口级限流
    • 用户级限流
    • IP 级限流
    • 全局限流 vs 单机限流
  • 实现方式
    • Sentinel(推荐,功能全面)
    • Guava RateLimiter(单机)
    • Nginx 限流(ngx_http_limit_req_module
    • 网关层限流(Spring Cloud Gateway)
  • 面试怎么答
    • “令牌桶更适合业务流量,因为能允许短时突发;固定窗口简单但容易抖;真正落地时还要讲限流位置、限流粒度和被限后返回什么。”
  • 易错点
    • 只讲算法,不讲限流命中后如何做友好降级、排队或快速失败。

3.2 熔断 ★★★

  • 核心结论
    • 熔断是为了在下游持续失败时,主动切断调用,避免把故障扩散成线程池耗尽和级联雪崩。
  • 熔断器模式(Circuit Breaker)
    • Closed → Open → Half-Open
    • 滑动窗口统计失败率
  • 快速失败(Fail Fast)
  • 超时设置的艺术
    • 连接超时 vs 读超时
    • 超时传播与超时预算
  • 面试怎么答
    • “熔断不是单独用的,要和超时、隔离、降级一起说。没有超时预算的熔断配置,通常会误判或迟钝。”
  • 易错点
    • 把熔断等同于降级。熔断是触发机制,降级是兜底策略。

3.3 降级 ★★★

  • 核心结论
    • 降级是主动选择保核心、舍边缘,让系统在不完美状态下继续服务。
  • 降级策略
    • 返回默认值或缓存值
    • 功能降级(关闭非核心功能)
    • 人工降级开关
  • 降级 vs 熔断的区别
    • 熔断:被动触发,保护自身
    • 降级:主动策略,保障核心
  • 面试怎么答
    • “降级要先区分核心功能和边缘功能。比如下单页必须活着,推荐、评论、画像刷新这些都可以临时牺牲。”

3.4 重试与幂等 ★★★

  • 核心结论
    • 重试解决的是临时失败,幂等解决的是重试或重复请求带来的重复执行风险,两者必须成对出现。
  • 重试策略
    • 固定间隔 / 指数退避(Exponential Backoff)
    • 最大重试次数
    • 可重试条件(超时 / 网络异常 vs 业务异常)
  • 幂等设计 ★★★
    • 唯一请求 ID + 去重表
    • Token 机制(前端获取 token,后端校验消费)
    • 数据库唯一约束
    • 状态机控制
  • 原理展开
    • 只要系统有超时重试、消息重复投递、客户端重复提交,就一定会遇到幂等问题。面试里别把幂等只讲成“加个唯一索引”,要说明幂等键、去重窗口和状态机约束。
  • 面试怎么答
    • “我会先区分哪些错误可重试,再配合指数退避和抖动控制重试风暴;所有可重试链路都要补幂等,不然重试只是在放大事故。”
  • 易错点
    • 对业务异常也盲目重试,或者只做应用层幂等、不做数据库侧兜底。

3.5 容灾与冗余 ★★

  • 多机房部署(同城双活 / 异地多活)
  • 数据冗余与备份策略
  • 故障转移(Failover)
  • 故障演练(Chaos Engineering)
  • 面试怎么答
    • “容灾不是多加机器,而是明确故障域、切流策略和数据恢复方式。真正难的是切换后的数据一致性和回切策略。”

4. 性能优化方法论 ★★★

4.1 性能指标

  • QPS / TPS / RT
  • TP99 / TP999
  • 吞吐量 vs 延迟的权衡
  • 并发数 = QPS × 平均 RT
  • 面试怎么答
    • “我会同时看吞吐、延迟和错误率。只提高 QPS 但 TP99 崩掉,不算真正的性能优化。”

4.2 性能分析工具

  • JVM:JProfiler、Arthas、async-profiler
  • 数据库:slow query log、EXPLAIN
  • 全链路:SkyWalking、Pinpoint
  • 压测:JMeter、wrk、Gatling
  • 面试怎么答
    • “工具只是定位手段,关键是形成从监控告警到代码热点、SQL、依赖调用的分层排查路径。”

4.3 性能优化思路 ★★★

  1. 找瓶颈:先观测再优化(不要盲目优化)
  2. 定位层级:网络 → 应用 → 数据库 → 中间件
  3. 优化方向
    • 缓存:减少计算和 IO
    • 异步:非关键路径异步化
    • 并行:利用多核并行处理
    • 批量:减少交互次数
    • 压缩:减少传输量
    • 预处理:提前计算
  • 面试怎么答
    • “优化方法论的核心是闭环:先测量,再定位,再优化,再回归验证。如果没有基线和回归数据,所谓优化只是感觉。”

5. 典型高并发场景 ★★★

5.1 秒杀系统 ★★★

  • 核心结论
    • 秒杀的本质是用层层过滤,把大部分无效流量挡在数据库之外,只让少量合法请求进入核心扣库存链路。
  • 前端:静态化、CDN、按钮防重
  • 网关:限流、过滤无效请求
  • 服务层:内存预减库存、异步下单
  • 数据层:Redis 原子扣减、队列串行化
  • 超卖问题:Redis Lua + 数据库乐观锁兜底
  • 面试怎么答
    • “我会从入口、库存、下单、落库四层去讲。核心是两次过滤、一次原子扣减、一次数据库兜底,而不是只说 Redis 秒杀脚本。”

5.2 订单系统 ★★★

  • 下单流程:创建订单 → 扣库存 → 扣款 → 通知
  • 分布式事务保障
  • 订单超时取消:延迟队列 / 时间轮
  • 核心关注:幂等、状态机、对账、补偿
  • 面试怎么答
    • “订单系统重点不只在高并发,更在状态流转正确。下单成功但支付超时、重复支付、库存回补失败,都要用状态机和补偿链路兜住。”

5.3 Feed 流系统 ★★

  • 推模式(Push) vs 拉模式(Pull) vs 推拉结合
  • 大 V 问题的处理
  • Timeline 排序
  • 面试怎么答
    • “Feed 的关键不是背 Push/Pull 定义,而是说明不同粉丝规模下写扩散和读扩散的 trade-off,以及缓存如何配合时间线读取。”

二、高频面试题

基础级(P7必答)

  1. 从零到一设计一个高并发系统时,你会先确认哪些信息?
  • 30秒答法
    • “我会先确认四类输入:核心业务链路、峰值 QPS 和读写比例、TP99 与可用性目标、是否允许排队降级和最终一致。先把问题定义清楚,再决定是先上缓存、限流还是异步化。”
  • 关键词
    • 核心链路
    • 峰值流量
    • SLA
    • 一致性边界
  • 追问提醒
    • 面试官常继续问:如果这些信息拿不到,你会如何保守估算并给阶段方案?
  1. 容量规划为什么不能只看平均 QPS?峰值和冗余怎么考虑?
  • 30秒答法
    • “平均 QPS 会掩盖促销、故障切流和瞬时尖峰。容量规划要按峰值流量设计,再乘活动系数和冗余系数,至少让核心链路在单点故障或节点摘除后还能稳定服务。”
  • 关键词
    • 峰值流量
    • 冗余系数
    • 故障切流
    • 安全水位
  • 追问提醒
    • 可能追问:你会怎么估 Redis、DB、MQ 的容量,而不是只估 Web 层?
  1. 高并发系统常见的分层有哪些?每一层分别解决什么问题?
  • 30秒答法
    • “我一般拆成接入层、服务层、缓存层、异步层、数据层和治理层。入口先挡无效流量,缓存吃热点读,异步层削峰填谷,数据层承接核心状态,治理层负责监控、灰度和回滚。”
  • 关键词
    • 分层过滤
    • 热点读
    • 削峰填谷
    • 治理闭环
  • 追问提醒
    • 常见追问是:某一层出问题时,哪些功能该降级,哪些不能动?
  1. 如何设计一个限流方案?令牌桶和漏桶的区别?
  • 30秒答法
    • “如果业务允许短时突发,我优先选令牌桶;如果追求匀速输出,可以考虑漏桶。真正设计时还要同时说明限流位置、粒度、是否分布式,以及被限后是排队、降级还是快速失败。”
  • 关键词
    • 令牌桶
    • 漏桶
    • 限流粒度
    • 快速失败
  • 追问提醒
    • 可能追问:全局限流怎么做?Redis + Lua 和 Sentinel 集群限流各有什么特点?
  1. 什么是熔断?熔断器的三种状态?和降级的区别?
  • 30秒答法
    • “熔断是在下游持续失败时主动断开调用,避免拖垮自己。典型状态是 Closed、Open、Half-Open。熔断是触发机制,降级是兜底策略,通常还要和超时、隔离一起落地。”
  • 关键词
    • Circuit Breaker
    • Closed/Open/Half-Open
    • 超时预算
    • 降级策略
  • 追问提醒
    • 常见追问:失败率阈值和半开探测流量如何设定?
  1. 接口幂等性怎么保证?有哪些实现方案?
  • 30秒答法
    • “幂等的核心是让同一个业务请求多次执行结果一致。常见做法是唯一请求 ID、去重表或唯一索引、状态机约束,再配合 Token 或乐观锁。只要链路里有重试或重复提交,就必须补幂等。”
  • 关键词
    • 唯一请求 ID
    • 去重表
    • 状态机
    • 乐观锁
  • 追问提醒
    • 面试官常追问:幂等窗口多长、跨服务怎么传递幂等键、消息消费幂等怎么做?
  1. 多级缓存架构是什么?本地缓存和分布式缓存的一致性问题?
  • 30秒答法
    • “常见是 L1 本地缓存、L2 Redis、L3 CDN。热点读先在本地拦截,跨实例共享走 Redis。一致性通常靠失效通知、短 TTL 或版本号控制,不追求绝对实时,而是控制不一致窗口。”
  • 关键词
    • Caffeine
    • Redis
    • 失效通知
    • 短 TTL
  • 追问提醒
    • 可能继续追问:热点 key、缓存击穿和雪崩时分别怎么处理?
  1. 重试策略有哪些?什么情况下不应该重试?
  • 30秒答法
    • “我会优先用指数退避加随机抖动,只对超时、瞬时网络异常这类可恢复错误重试。对业务异常、非幂等操作和下游明确过载场景,不应该盲目重试。”
  • 关键词
    • Exponential Backoff
    • Jitter
    • 可恢复错误
    • 幂等前提
  • 追问提醒
    • 常见追问:客户端重试、网关重试、服务端重试三层叠加时怎么避免重试风暴?
  1. 如何排查一个接口响应慢的问题?
  • 30秒答法
    • “我会按链路分层排查:先看全链路追踪和监控确定慢在哪层,再看应用热点、线程池排队、SQL 和缓存命中率,最后再决定是扩容、优化 SQL、加缓存还是做异步化。”
  • 关键词
    • 链路追踪
    • 线程池
    • 慢 SQL
    • 缓存命中率
  • 追问提醒
    • 面试官可能追问:如果 CPU 很低但 RT 很高,你最先怀疑什么?
  1. 线程池参数怎么设置?CPU 密集型和 IO 密集型的区别?
  • 30秒答法
    • “线程池参数要结合任务类型和下游延迟看。CPU 密集型更关注核数和上下文切换,IO 密集型要考虑等待时间和队列长度。生产上更重要的是有界队列、拒绝策略和动态观测,而不是死背一个公式。”
  • 关键词
    • 核数
    • 有界队列
    • 拒绝策略
    • 动态调优
  • 追问提醒
    • 常见追问:为什么线程池开太大反而会让 RT 变差?
  1. 什么是指数退避?为什么要加随机抖动(jitter)?
  • 30秒答法
    • “指数退避是让重试间隔按倍数增长,避免错误发生时继续打爆下游;随机抖动是把多个客户端的重试时刻打散,防止惊群效应。”
  • 关键词
    • 指数退避
    • Jitter
    • 惊群
    • 重试风暴
  • 追问提醒
    • 可能追问:退避上限怎么设?服务端返回 429/503 时要不要动态调整?
  1. Reactor 线程模型是什么?在高并发中如何应用?
  • 30秒答法
    • “Reactor 是基于事件驱动和 IO 多路复用的模型。单 Reactor 适合简单场景,主从 Reactor 多线程更适合高并发网络服务。典型落地是 Netty、Spring WebFlux 和基于 Netty 的网关。”
  • 关键词
    • NIO
    • 多路复用
    • Boss/Worker
    • Netty
  • 追问提醒
    • 常见追问:Reactor 和传统线程池阻塞模型的适用边界分别是什么?

进阶级(P8+深挖)

  1. 如何设计一个异地多活架构?数据一致性怎么解决?
  • 30秒答法
    • “异地多活的核心不是多部署几个机房,而是先划清故障域和数据归属。通常按用户或租户路由到归属机房,核心交易数据尽量单元化处理,跨机房数据走异步同步,并配冲突检测和回切策略。”
  • 关键词
    • 单元化
    • 故障域
    • 异步同步
    • 冲突检测
  • 追问提醒
    • 面试官常追问:脑裂、双写冲突和切流回切怎么做?
  1. 你做过的性能优化中最有成效的是哪次?量化数据?
  • 30秒答法
    • “这类题不要堆概念,要按‘场景、瓶颈、动作、结果’说。先说明业务场景和瓶颈证据,再讲你做了哪些缓存、异步、SQL 或架构优化,最后给出 RT、QPS、成本的量化改善。”
  • 关键词
    • 场景
    • 证据
    • 动作
    • 量化结果
  • 追问提醒
    • 常见追问:如果效果没有达到预期,你怎么继续定位?
  1. 高并发下如何做到热点数据的实时更新?
  • 30秒答法
    • “热点数据通常用本地缓存加 Redis 双层结构,再通过 MQ 或 Pub/Sub 广播失效。核心不是绝对实时,而是控制一致性窗口,并避免热点 key 把单个 Redis 节点打穿。”
  • 关键词
    • 本地缓存
    • Pub/Sub
    • 热点 key
    • 一致性窗口
  • 追问提醒
    • 可能追问:极端热点下,如何做 key 打散和多副本读?
  1. 秒杀系统从流量入口到数据库的全链路设计?
  • 30秒答法
    • “我的思路是层层过滤:前端静态化和 CDN 先挡住大流量,网关限流和风控先筛掉无效请求,Redis Lua 原子扣减控制库存,MQ 异步下单拉平写峰值,数据库乐观锁做最终兜底。”
  • 关键词
    • 层层过滤
    • Redis Lua
    • MQ 削峰
    • 乐观锁
  • 追问提醒
    • 常见追问:Redis 扣减成功但 MQ 发送失败,或者消费者失败时怎么办?
  1. 如何做故障演练(Chaos Engineering)?有什么工具和方法?
  • 30秒答法
    • “故障演练要从稳态指标出发,先定义预期,再小范围注入故障,观测系统是否还能保持核心能力,最后复盘并补监控和预案。没有回滚方案和观测指标的演练是危险的。”
  • 关键词
    • 稳态假说
    • 故障注入
    • 观测指标
    • 回滚预案
  • 追问提醒
    • 可能追问:第一次演练你会挑哪个故障场景,为什么?
  1. 一个系统是该优先扩容、拆分还是异步化,你如何判断?
  • 30秒答法
    • “先看瓶颈性质。资源型瓶颈优先扩容,模块互相抢资源或边界混乱时考虑拆分,核心链路里存在非必要同步步骤时适合异步化。先定位再动作,不靠直觉选方案。”
  • 关键词
    • 资源瓶颈
    • 边界拆分
    • 非关键同步
    • 先定位后动作
  • 追问提醒
    • 常见追问:扩容为什么有时几乎不提升吞吐?
  1. 如果预算有限,你会如何做高并发系统的分阶段演进?
  • 30秒答法
    • “我会优先做投入产出比最高的事情:先优化 SQL 和索引、加缓存、做限流和异步,等流量继续增长再拆分服务、分库分表和做容灾。目标是用最小复杂度解决当前主瓶颈。”
  • 关键词
    • ROI
    • SQL/索引
    • 缓存
    • 阶段演进
  • 追问提醒
    • 面试官可能继续问:你会用什么指标定义‘该升级到下一阶段’?
  1. 设计一个日志收集系统?ELK + Kafka 架构?
  • 30秒答法
    • “典型链路是采集端 Filebeat、缓冲层 Kafka、处理层 Logstash 或 Flink、存储检索层 Elasticsearch、展示层 Kibana。关键不是背组件,而是讲清削峰、分区、索引生命周期和脱敏策略。”
  • 关键词
    • Filebeat
    • Kafka
    • Elasticsearch
    • ILM
  • 追问提醒
    • 常见追问:TB 级日志如何做冷热分层、分片规划和写入吞吐优化?

三、实战场景题(P8+重点)

  1. 秒杀设计:100 万人抢 1000 件商品,从前端到数据库,完整设计方案?如何防止超卖?
  • 回答框架
    • 先明确活动峰值、库存量、下单是否要求实时反馈
    • 再按入口过滤、库存控制、异步下单、落库兜底四层展开
    • 最后补幂等、回补库存、监控和压测结论
  • 核心关注点
    • 超卖控制
    • 热点隔离
    • MQ 失败补偿
    • 数据回滚策略
  1. 接口优化:一个接口 TP99 是 2 秒,内部调用了 3 个下游服务和 2 次数据库查询,如何优化到 200ms?
  • 回答框架
    • 先拆分耗时占比,确认慢在网络、DB、串行调用还是线程池排队
    • 再按缓存、并行调用、批量化、异步化和 SQL 优化逐项收敛
    • 最后给回归压测和灰度上线方案
  • 核心关注点
    • 耗时拆解
    • 并行与超时预算
    • 缓存命中率
    • 回归验证
  1. 流量突增:平时 QPS 1000,突然涨到 10000,系统怎么扛?短期和长期方案?
  • 回答框架
    • 先给短期保命动作:限流、降级、扩容、缓存预热
    • 再给中长期治理动作:异步削峰、热点隔离、分层扩容、容量预案
    • 最后说明如何复盘并调整水位线
  • 核心关注点
    • 保核心链路
    • 临时止血
    • 长期演进
    • 水位线校准
  1. 全局限流:分布式环境下如何实现精确的全局限流?Sentinel 的集群限流原理?
  • 回答框架
    • 先区分单机限流和全局限流
    • 再说明 Redis + Lua、网关集中式、Sentinel 集群模式等实现路径
    • 最后比较精度、可用性和复杂度
  • 核心关注点
    • 计数一致性
    • 中心节点可用性
    • 限流精度
    • 降级策略
  1. 异地多活:电商系统要做异地双活,你会如何设计?核心难点是什么?
  • 回答框架
    • 先定义哪些业务单元必须单活归属,哪些数据可异步同步
    • 再讲流量路由、数据复制、故障切流和回切
    • 最后补冲突处理、压测演练和应急预案
  • 核心关注点
    • 单元化路由
    • 数据冲突
    • 切流回切
    • 演练闭环

四、学习资源推荐

书籍

  • 《高并发系统设计40问》:适合建立高并发治理主线
  • 《亿级流量网站架构核心技术》:适合补典型实战手法
  • 《Site Reliability Engineering》:适合补高可用与稳定性治理

博客/文章

  • 美团技术博客:缓存、限流、稳定性治理案例较多
  • 阿里技术:大促、双活、故障演练实战材料较多
  • InfoQ 架构专栏:适合补工程化治理视角

视频

  • 极客时间《高并发系统设计40问》
  • 极客时间稳定性治理相关公开课
  • 质量较高的秒杀 / 链路压测复盘分享

On this page