系统设计主题
相关源文件
本页面概述了设计可扩展、可靠系统所需的核心概念和组件。它旨在为理解《系统设计入门》中探讨的关键架构原则提供路线图。
有关如何应对系统设计面试问题的详细指导,请参阅如何应对系统设计面试问题。
什么是系统设计主题?
系统设计主题涵盖了构建大规模分布式系统所用的基本原则、模式和组件。这些主题代表了工程师在架构高性能、可扩展、可靠和可维护系统时必须考虑的关键决策和权衡。
来源:README.md100-170
系统设计中的核心权衡
每个系统设计都涉及关键权衡,以平衡相互冲突的考量。理解这些基本权衡对于做出明智的架构决策至关重要。
如果服务能够随着资源的增加而按比例处理增加的负载,则该服务是可扩展的。这与性能不同,性能是指系统完成单个工作单元的速度。
| 性能问题 | 可扩展性问题 |
|---|
| 系统对单个用户响应缓慢 | 系统对单个用户响应快速,但在高负载下变慢 |
| 优化算法、查询和资源使用 | 为分布式、并行化和资源添加而设计 |
来源:README.md412-424
延迟 vs 吞吐量
延迟是指执行操作或产生结果所需的时间,以时间单位(毫秒、秒)衡量。
吞吐量是指单位时间内可以处理的操作或结果的数量,以每秒操作数衡量。
有效的系统设计通常旨在以可接受的延迟实现最大吞吐量。
来源:README.md426-436
可用性 vs 一致性 (CAP 定理)
CAP 定理指出,在分布式系统中,您只能保证以下三个属性中的两个:
- 一致性:每次读取都会接收到最新的写入或错误
- 可用性:每个请求都会收到响应,但不保证数据最新
- 分区容错性:系统在网络故障时仍能继续运行
由于网络故障不可避免,您必须在一致性和可用性之间做出选择。
来源:README.md439-472
一致性模式
一致性模式定义了分布式系统中多份数据副本如何同步。
| 模式 | 描述 | 示例用例 |
|---|
| 弱一致性 | 写入后,读取可能看到也可能看不到 | VoIP、视频聊天、实时游戏 |
| 最终一致性 | 写入后,读取最终会看到(通常在毫秒级) | DNS、电子邮件、高可用系统 |
| 强一致性 | 写入后,读取会看到(数据同步复制) | 文件系统、关系型数据库管理系统、事务系统 |
来源:README.md474-498
可用性模式
可用性模式确保系统在组件故障时仍能正常运行。
故障转移
复制
数据复制确保信息存储在多个位置,从而提高可用性和读取性能。
- 主从复制:主节点处理写入,从节点处理读取
- 主主复制:多个主节点处理读取和写入
来源:README.md500-547
网络组件
域名系统 (DNS)
DNS 将人类可读的域名(例如 example.com)转换为 IP 地址。它是分层的,顶级有权威服务器,整个系统中有各种缓存机制。
主要 DNS 记录类型
- A 记录:将域名映射到 IPv4 地址
- CNAME 记录:将域名映射到另一个域名
- MX 记录:指定域的邮件服务器
- NS 记录:指定域的权威名称服务器
来源:README.md581-618
内容分发网络 (CDN)
CDN 是一个全球分布式代理服务器网络,它从更靠近用户的位置提供内容,从而提高性能并减少源服务器的负载。
CDN 主要有两种操作模式:
- 推式 CDN:当源站内容发生变化时,内容被上传到 CDN
- 拉式 CDN:当用户首次请求时,内容从源站获取
来源:README.md620-658
负载均衡器
负载均衡器将传入的客户端请求分发到多个服务器,以确保没有单个服务器过载,从而提高应用程序的可用性和响应性。
负载均衡器在不同的网络层运行:
- 四层负载均衡:基于 IP 地址和端口进行路由(传输层)
- 七层负载均衡:基于 HTTP 头和内容等应用层数据进行路由
来源:README.md660-729
反向代理
反向代理位于 Web 服务器前面,将客户端请求转发到相应的后端服务器。它除了负载均衡之外,还提供额外的功能:
- 安全性(隐藏后端基础设施)
- SSL 终止
- 压缩
- 静态内容服务
- 缓存
来源:README.md731-772
应用层
应用层包含处理客户端请求的业务逻辑。将应用层与 Web 层分离可以实现独立扩展。
微服务
微服务架构将应用程序分解为小型、松耦合的服务,这些服务可以独立开发、部署和扩展。
服务发现
服务发现机制允许服务之间相互查找和通信,而无需硬编码位置。
- 客户端发现:客户端查询服务注册表以查找服务实例
- 服务器端发现:路由器(例如负载均衡器)查询服务注册表
来源:README.md774-807
数据管理
数据库系统
关系型数据库管理系统 (RDBMS)
关系型数据库管理系统 (RDBMS) 将数据存储在具有预定义模式的结构化表中,并支持 ACID 事务
- 原子性(Atomicity):事务要么全部成功,要么全部失败
- 一致性(Consistency):事务使数据库从一个有效状态转换到另一个有效状态
- 隔离性(Isolation):并发事务互不干扰
- 持久性(Durability):已完成的事务是永久性的
扩展策略包括:
- 主从复制
- 主主复制
- 联邦(Federation)(功能分区)
- 分片(Sharding)(水平分区)
- 反范式化
来源:README.md809-949
NoSQL
NoSQL 数据库提供了固定模式表的替代数据模型
NoSQL 数据库通常优先考虑 BASE 模型
- 基本可用(Basically Available):系统保证可用性
- 软状态(Soft state):状态可能在没有输入的情况下发生变化
- 最终一致性(Eventual consistency):系统会随着时间的推移最终达到一致
来源:README.md992-1090
缓存
缓存将频繁访问的数据存储在内存中,以减少数据库负载并提高响应时间。
常见的缓存策略
- 旁路缓存(Cache-aside):应用程序按需将数据加载到缓存中
- 直写缓存(Write-through):应用程序写入缓存,缓存写入数据库
- 回写缓存(Write-behind):应用程序写入缓存,缓存异步写入数据库
- 预加载缓存(Refresh-ahead):缓存自动刷新频繁访问的数据
缓存可以在不同层面实现:
- 客户端缓存(浏览器)
- CDN 缓存
- Web 服务器缓存
- 数据库缓存
- 应用程序缓存
来源:README.md1133-1323
通信模式
异步
异步处理通过将耗时操作与请求-响应周期解耦,从而提高系统响应能力。
主要异步模式
- 消息队列:存储消息直到消费者能够处理它们
- 任务队列:将工作分配给多个工作者
- 背压:限制队列大小以保持系统稳定性
来源:README.md1325-1368
通信协议
HTTP
HTTP 是一种用于 Web 客户端-服务器通信的请求-响应协议。主要 HTTP 方法:
| 方法 | 目的 | 幂等 | 安全 |
|---|
| GET | 获取资源 | 是 | 是 |
| POST | 创建资源 | 否 | 否 |
| PUT | 更新/替换资源 | 是 | 否 |
| DELETE | 删除资源 | 是 | 否 |
| PATCH | 部分更新资源 | 否 | 否 |
TCP vs UDP
TCP(传输控制协议):
- 面向连接,保证交付
- 保持数据包顺序
- 错误检查与恢复
- 用于 Web 服务器、电子邮件、文件传输
UDP(用户数据报协议):
- 无连接,不保证交付
- 不保证数据包顺序
- 无拥塞控制
- 用于流媒体、VoIP、游戏
远程过程调用 (RPC) vs REST
RPC:
- 侧重于操作/行为
- 客户端调用远程过程如同本地调用
- 常用于内部服务间通信
- 示例:gRPC, Thrift
REST:
- 侧重于资源和状态
- 使用标准 HTTP 方法
- 无状态,可缓存
- 常用于公共 API
来源:README.md1370-1558
结论
本系统设计主题概述为理解构建可扩展、可靠分布式系统中的关键组件和考量提供了基础。每个主题都代表了工程师在设计现代应用程序时必须仔细考虑的系统架构关键方面。
如需这些概念的实际应用,请参阅系统设计解决方案。