
文章目录
一、总体系
二、分布式:解决“扩展性”问题
三、高性能:解决“吞吐量/延迟”问题
四、高可用:解决“故障容错”问题
五、补充
最近在学 分布式、高性能、高可用这块内容,知识点比较多,特此简单梳理一下 相关知识体系、学习重点、常见面试点等。
“分布式、高性能、高可用”可以理解成后端架构能力的三根主线,他们不是三个独立模块,而是一套围绕规模与故障设计的系统体系,也是一套系统从“能拆开跑、跑得快、坏了还能跑”三个角度建立起来的能力体系:
分布式解决“单机装不下、扛不住”;高性能解决“处理得够不够快”;高可用解决“出故障还能不能服务”。
方向 | 核心问题 | 学习重点/常见手段 | 常见面试点 |
|---|---|---|---|
分布式 | 单机不够用,如何拆成多个节点协同 | 服务拆分、RPC、注册发现、负载均衡、分布式事务、一致性、幂等、CAP | CAP、BASE、分布式锁、分布式ID、接口幂等、最终一致性、服务治理 |
高性能 | 如何承载更高 QPS、更低延迟 | 缓存、异步化、批处理、连接池、索引优化、限流、读写分离、分库分表、消息队列 | Redis 缓存、SQL 优化、线程池、MQ 削峰、慢接口排查 |
高可用 | 系统部分故障时如何继续服务 | 多副本、故障转移、熔断降级、超时重试、限流、幂等设计、容灾、监控告警 | 熔断降级、重试风暴、服务雪崩、主从切换、RTO/RPO、故障转移 |
分布式(基础能力)
/ \
高性能 高可用
(通过并发/缓存/异步 (通过冗余/容错/监控
提升处理能力) 保证系统稳定)三者互相支撑,不能孤立设计。
它们也存在冲突:
所以体系设计不是“技术堆得越多越好”,而是根据业务指标做取舍。
一个典型的高性能高可用系统,可以按请求链路自上而下拆解:
客户端
↓
DNS / CDN
↓
负载均衡(LVS/Nginx)
↓
网关层API Gateway
├─ 鉴权
├─ 限流
└─ 路由
↓
应用服务层
↓
无状态服务集群
├─ 缓存层:本地缓存 / Redis
├─ 消息队列 → 异步消费者
└─ 数据库集群
├─ 主从复制
├─ 读写分离
└─ 分库分表
↓
监控、日志、链路追踪、告警每一层都要同时考虑三个维度:分布式(横向扩展能力)、高性能(单位时间处理量)、高可用(故障时依然可用)。
外围还要配套:
最终衡量它是否成立,不看用了多少中间件,而看能否回答这些问题:
这几个问题有明确答案,才算真正形成了分布式、高性能、高可用体系。
分布式的重点是“多个服务、多个节点、多个数据副本之间如何协作”。
核心思路:拆分 + 协同
常见拆分方式:
典型链路:
客户端
↓
CDN / DNS
↓
负载均衡 / API Gateway
↓
多个无状态服务实例
↓
缓存 / 消息队列 / 数据库分布式会带来新的复杂性:
因此通常还需要超时、重试、幂等、限流、熔断、分布式追踪和最终一致性等机制。
需要掌握:
面试常问:
高性能的核心是“减少等待、减少重复计算、提升并发处理能力”。
性能主要看三个指标:
常见优化顺序:
例如:
请求 → Redis 命中 → 直接返回
↓ 未命中
查询数据库
↓
写入缓存高性能不等于无限加机器。系统可能卡在数据库锁、热点 Key、连接池、下游接口或网络带宽上,必须通过压测和监控找到真正瓶颈。
需要掌握:
面试常问:
高可用的核心是“故障一定会发生,系统要能扛住”。
高可用的核心是:
消除单点故障,并控制故障传播范围。
常见手段包括:
例如商品推荐服务发生故障时,主链路不应该一起失败:
商品详情请求
├─ 商品信息:必须成功
├─ 库存信息:必须成功
└─ 推荐服务:失败时返回空推荐这就是降级:牺牲非核心功能,保住核心业务。
需要掌握:
面试常问:
消息队列属于以上哪一类?消息队列整个体系是怎样的,包括哪些模块?学习重点是什么,面试相关是怎样的
核心结论先说:
消息队列不属于单一类别,它横跨三个体系——本质上是高性能的手段(异步处理、削峰填谷、解耦系统、提升吞吐量),依托分布式架构部署(集群化的中间件),同时又反过来支撑高可用(解耦故障、消息不丢)。这也是 MQ 在面试和实际架构中总被反复提到的原因:它是连接三个体系的枢纽型组件。更准确地说:
角度 | MQ 的作用/体现方式 |
|---|---|
分布式 | MQ 本身通常是分布式部署的中间件(如 Kafka 的多 Broker 集群),服务之间通过消息解耦,事件驱动协作 |
高性能 | 异步化处理、削峰填谷,提升系统吞吐量(这是 MQ 最核心、最常被提及的定位) |
高可用 | 通过消息持久化 + 多副本机制 + 死信队列,保证消息不丢失,系统某个下游服务挂掉时上游依然可用(削峰、隔离故障) |
所以面试里不要只说“MQ 属于高性能”。更好的回答是:
消息队列本质上是分布式系统里的异步通信中间件,主要用于提升系统性能和吞吐,同时也承担服务解耦、削峰填谷、最终一致性和故障恢复能力。
MQ 是实现"高性能"的手段(异步/削峰),依托"分布式"架构部署(集群),并反过来增强系统的"高可用"能力(解耦、隔离故障)。
消息队列体系
├── 基础概念层
│ ├── 生产者/消费者/Broker/Topic/Partition
│ ├── 点对点模式 vs 发布订阅模式
│ └── 消息模型(队列模型 vs 发布订阅模型)
│
├── 核心机制层
│ ├── 消息发送:同步/异步/单向发送
│ ├── 消息存储:顺序写磁盘、页缓存、零拷贝(Kafka)
│ ├── 消息消费:拉模式(Pull) vs 推模式(Push)
│ ├── 消费位移(Offset)管理
│ └── 分区与负载均衡(Consumer Group 再均衡)
│
├── 可靠性保障层
│ ├── 消息丢失场景与应对(生产端确认、Broker 持久化、消费端 ACK)
│ ├── 消息重复消费与幂等性设计
│ ├── 消息顺序性保证(单分区顺序、全局顺序代价)
│ └── 事务消息(半消息机制,RocketMQ 事务消息)
│
├── 高可用与集群层
│ ├── 副本机制(Leader/Follower,ISR 机制 - Kafka)
│ ├── 主从切换与选举
│ ├── 消息堆积处理
│ └── 死信队列(DLQ)、延迟队列
│
├── 性能优化层
│ ├── 批量发送、压缩
│ ├── 顺序 IO、PageCache、零拷贝
│ └── 分区数设计与吞吐量关系
│
└── 主流产品对比
├── Kafka(高吞吐、大数据场景)
├── RocketMQ(金融级、事务消息强)
├── RabbitMQ(轻量、路由灵活、AMQP 协议)
└── Pulsar(存算分离新一代架构)消息队列整体可以分成这些模块:
模块 | 作用 |
|---|---|
Producer 生产者 | 发送消息的一方 |
Broker 消息服务器 | 存储、转发、管理消息 |
Topic / Queue | 消息分类或队列 |
Consumer 消费者 | 拉取或接收消息并处理 |
Consumer Group | 消费者组,用于负载均衡消费 |
Offset | 消费进度 |
ACK 确认机制 | 确认消息是否处理成功 |
Retry 重试机制 | 消费失败后再次投递 |
Dead Letter Queue 死信队列 | 多次失败后进入异常队列 |
Persistence 持久化 | 防止 Broker 宕机丢消息 |
Replication 副本 | 提高 MQ 本身可用性 |
Ordering 顺序消息 | 保证同一业务维度消息有序 |
Delay Message 延迟消息 | 指定时间后再投递 |
Transaction Message 事务消息 | 配合本地事务保证最终一致性 |
常见产品:
MQ 核心问题
学习 MQ 时,重点不是只会用 API,而是要理解这些问题:
1)为什么用 MQ?
核心场景:
2)MQ 会带来什么问题?
引入 MQ 后,系统复杂度会上升:
3)如何保证消息不丢?
从三段看:
4)如何处理重复消费?
靠幂等,不要指望 MQ 永远只投递一次。
常见方案:
5)如何保证顺序消费?
常见方案:
代价是吞吐量会下降,所以顺序消息只应该用于真正需要有序的场景。
6)消息积压怎么办?
排查方向:
解决方式:
基础类
可靠性类(重灾区)
高可用/集群类
深入原理类(中高级面试)
场景设计类
一个比较完整的面试回答模板是:
我们使用 MQ 主要是为了解耦、异步和削峰。生产者发送消息后由 Broker 持久化,消费者异步消费。为了保证可靠性,生产端需要发送确认和失败重试,Broker 需要持久化和副本机制,消费端使用手动 ACK。由于 MQ 通常只能保证至少一次投递,所以业务侧必须做幂等。对于顺序消息,会按业务 key 路由到同一个队列或分区。对于消费失败,会通过重试和死信队列兜底。监控上重点看消息积压、消费延迟、失败率和 Broker 可用性。
学习顺序建议是:
MQ 是连接这三块知识的典型中间件,面试价值很高。重点不是背概念,而是能围绕“为什么用、解决什么问题、引入什么风险、怎么兜底”讲清楚。
参考:JavaGuide消息队列面试题
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。