本课程由机器自动翻译成中文,尚未经过人工校对。如果读起来有些奇怪,请以英文原文为准。
每个大型应用程序都是由相同的基本构建块组装而成。面试官并不期望你发明新技术 - 他们希望看到你针对给定问题选择并组合正确的组件。本课程涵盖您在每次设计面试中都会用到的工具包。
从本质上讲,网络遵循一个简单的模型:客户端发送请求,服务器处理它们,然后返回响应。但现代系统在这两个端点之间添加了层来处理规模、可靠性和性能。
一个典型的请求可能会经过:客户端→CDN→负载均衡器→API网关→应用服务器→缓存→数据库。每一层都解决一个特定的问题,了解“何时”需要每层可以将强大的候选者与普通的候选者区分开来。
在面试中,在深入细节之前,始终先勾勒出高级客户端-服务器流程。它显示了结构化思维。
单个服务器的容量是有限的。负载均衡器使用以下策略在多个服务器之间分配传入请求:
负载均衡器还执行健康检查,自动从池中删除不健康的服务器。在云环境中,AWS ALB 或 Azure Front Door 等服务可以透明地处理此问题。
社交媒体源服务接收的读取次数比写入次数多 10 倍。哪种负载平衡方法最能确保用户始终访问同一缓存热服务器?
缓存将经常访问的数据存储在离消费者更近的地方。它存在于多个层面:
|层 |示例|延迟 | |--------|---------|---------| |浏览器缓存 |静态资产、API 响应 | ~0 毫秒 | | CDN |图片、CSS、JS 文件 | 〜10-50ms | |应用程序缓存 | Redis、Memcached | 〜1-5ms | |数据库缓存|查询结果缓存 | 〜5-10ms |
缓存失效是众所周知的计算中最困难的问题之一。常见策略包括TTL(生存时间)、直写(每次写入时更新缓存)和缓存旁路(应用程序显式管理缓存)。
Phil Karlton 的名言 - “计算机科学中只有两件事很难:缓存失效和命名” - 被广泛引用,几乎成为系统设计面试中的必经之路。
选择正确的数据库是最有影响力的设计决策之一:
SQL 数据库(PostgreSQL、MySQL)提供 ACID 事务、强一致性和结构化模式。当数据具有清晰的关系并且您需要带有连接的复杂查询时,它们会表现出色。
NoSQL 数据库 有多种类型:
您正在设计一个系统,用于存储具有经常更改的半结构化数据(每种用户类型不同的字段)的用户配置文件。哪种数据库类型最适合?
登录 后参与讨论
并非每个操作都需要立即响应。消息队列(RabbitMQ、Apache Kafka、AWS SQS)将生产者与消费者分离,从而实现:
Kafka 值得特别提及:它不仅仅是一个队列,而是一个分布式事件日志,支持事件驱动的架构,其中多个消费者可以独立处理相同的事件流。
|方面|巨石|微服务| |--------|----------|----------------| |部署 |单机|独立服务| |缩放 |一起扩展一切|扩展个性化服务| |复杂性 |上手更简单 |运营费用| |数据|共享数据库|每个服务的数据库 |
启动单体应用,在需要时提取微服务。 大多数面试官都欣赏那些承认微服务会带来分布式系统复杂性(网络故障、数据一致性、部署编排)并且并不总是正确选择的候选人。
Netflix 多年来从单体架构迁移到微服务,这一点众所周知。但处理数十亿交易的 Shopify 仍然运行着模块化的整体架构。对于特定公司而言,哪些因素可能使一种方法优于另一种方法?
CAP 定理指出,分布式系统只能同时保证三个属性中的两个:
由于网络分区在分布式系统中是不可避免的,因此真正的选择是在CP(一致性优于可用性)和AP(可用性优于一致性)之间。
您正在设计一个银行交易系统,其中不正确的余额可能会导致财务损失。您应该优先考虑哪种 CAP 权衡?
当你参加系统设计面试时,请遵循以下结构:
想想您每天使用的系统 - Instagram、Uber 或 Spotify。您能确定它可能使用本课程中的哪些构建块吗?负载均衡器应该放在哪里?什么会被缓存?哪种数据库类型适合其数据模型?
接下来:我们将应用这些基础知识从头开始设计 URL 缩短器。