天天学CAP理论,不如搞懂这18个经典系统(附详细拆解)

The Latency Gambler 2026-03-18 09:35:24

前几年阅读了很多有关分布式系统、数据结构和可扩展性模式的教科书,终于可以解释 CAP定理并讨论最终一致性的细微差别了,但当被问及 Netflix 是如何同时向数百万用户传输视频时,我茫然了……

转折点发生在我停止将系统设计视为学术理论,开始对我每天使用的真实产品进行逆向学习的时候。突然间,分片、缓存和负载均衡这样的抽象概念,也变得清晰起来。它们不再是理论构造,而是公司已经解决的具体问题的实际解决方案。

如果你真的想成长,那就研究真实系统,而不仅仅是理论。以下是十八个案例研究,它们解释了你在生产环境中会遇到的90%的问题。

一、基金会:核心基础设施

1、URL短链接

每个系统设计之旅从这里开始都是有充分理由的。像Bitly这样的URL短链接服务教会你关于哈希函数、冲突处理和数据库索引的知识,你能了解到为什么Base62编码比十六进制能产生更短、更简洁的URL。同时你会发现,当适当索引后,一个简单的键值存储就足以处理数十亿的URL。

Long URL → Hash Function → Base62 Encode → Short Code

Lookup: Short Code → Database Query → Redirect (302)

Database schema:

{

short_code: "a3X9k",

long_url: "https://...",

created_at: timestamp,

click_count: integer

}

真正的学习发生在你考虑规模时。你如何在分布式服务器上生成唯一的短代码?Snowflake ID或通过ZooKeeper协调变得必要,这个简单的问题引入了分布式ID生成。

2、Amazon S3

对象存储看似简单,直到你考虑持久性保证。S3承诺99.999999999%的持久性(十一个九),它是如何做到的?

数据跨多个可用区复制、校验和检测损坏、以及持续的背景验证。S3教会了业界关于最终一致性权衡的知识。早期的S3有时会在写入后返回过时数据,因为复制需要时间;现代的S3提供了强大的写后读一致性,但理解这一演变过程揭示了重要的架构决策。

二、大规模系统:当百万变成十亿

1、YouTube 和 MySQL

YouTube在扩展到24.9亿用户的时候,坚持使用MySQL的决定,挑战了传统观念。每个人都认为在这种规模下需要NoSQL。YouTube的秘诀是什么?激进的按视频ID分片和广泛的缓存。

每个分片处理一部分视频,元数据查询先命中缓存,然后访问分片数据库。视频文件本身位于分布式对象存储中,这种架构证明了,如果你智能地分区并积极缓存,关系型数据库是可以扩展的。

2、Meta的无服务器函数

每秒处理1150万个无服务器函数调用,需要重新思考冷启动问题。Meta的架构预热函数容器,使用轻量级虚拟化,并实现智能调度以将请求路由到已经温暖的实例。

Request → Load Balancer → Function Router

Check Warm Pool

↓ ↓

Found Not Found

↓ ↓

Execute Cold Start

Add to Warm Pool

这里学到的是关于无状态执行以及隔离、启动时间和资源效率之间的权衡。

三、实时和消息传递架构

1、Kafka的设计哲学

Kafka通过将日志视为一等公民革新了消息传递。Kafka不是在消费后删除消息,而是将其保留可配置的时间段,消费者独立跟踪它们在日志中的偏移量。

这种简单的反转实现了重放、多个独立消费者和精确一次处理语义。Kafka为了并行性对主题进行分区,为了持久性对分区进行复制,这种架构支撑了数千家公司的事件驱动架构。

2、Slack的消息基础设施

大规模的实时聊天需要WebSocket连接以实现即时投递、消息持久化以保存历史记录,以及存在性检测以显示在线状态。Slack的挑战是维护数百万个并发连接,同时确保频道内的消息排序。

解决方案涉及基于频道的分片(一个频道的所有消息都路由到同一台服务器)、用于存在性信息的Redis,以及用于离线投递的消息队列。理解Slack的架构,可以教会你关于持久连接、发布-订阅模式以及分布式状态的复杂性。

四、金融和交易系统

1、Stripe 的幂等性

image.png

防止重复计费对支付系统至关重要。Stripe通过唯一的请求ID实现幂等性,如果客户端因网络超时而重试支付,Stripe会检测到重复的ID,并返回原始结果而不重复扣费。

def process_payment(amount, idempotency_key):

# Check if we've seen this key before

existing = db.get(idempotency_key)

if existing:

return existing.result

# Process payment

result = charge_card(amount)

# Store result with key

db.set(idempotency_key, result, ttl=24_hours)

return result

除了付款之外,此模式还适用于任何重试安全性很重要的操作。

2、证券交易所匹配

高频交易需要微秒级的延迟。证券交易所使用具有无锁数据结构的内存订单簿、物理邻近的托管服务以及内核旁路网络,以尽可能节省每一微秒。

撮合引擎维护着买单和卖单队列,按价格-时间优先级进行匹配,并广播交易确认。理解这个系统,可以教会你关于低延迟设计、无锁算法以及性能优化的极端情况。

五、社交和内容平台

1、Twitter 的时间线

Twitter(现为“X”)的挑战是为数亿用户生成个性化时间线,每个用户关注着数千个账号。简单的方法——获取所有关注账号的推文,按时间排序,返回前N条——是行不通的。

Twitter的解决方案涉及写时扇出,当用户发推时,它会扇出到所有关注者的时间线。对于拥有数百万粉丝的名人,Twitter则改用读时扇出,这种混合方法平衡了写入和读取成本。

2、Reddit 的投票系统

Reddit的热门排名算法平衡了新鲜度和受欢迎程度。该公式考虑了赞成票、反对票和提交时间,产生了有趣内容迅速上升的涌现行为。

在幕后,Reddit积极地使用缓存层。热门子版块首页被缓存,单个帖子页面被缓存,投票计数异步更新,这种架构可以处理帖子走红时的流量高峰。

3、Tinder 的地理空间匹配

查找附近的用户需要地理空间索引,Tinder可能使用地理哈希或R树来组织用户位置。当你滑动时,系统会查询你位置周围的半径,按偏好进行过滤,并应用匹配算法。

User location → Geohash → Database query (nearby users)

Apply filters (age, gender, etc)

Ranking algorithm

Return stack of profiles

这教会你关于空间数据库、位置数据的索引策略以及欧几里得距离与行驶距离之间的区别。

六、大规模工程

1、Uber 的司机匹配

实时匹配乘客与附近司机涉及地理空间查询、预计到达时间预测和供需平衡。在高峰时段每秒处理110万个请求,Uber依赖内存数据网格、复杂的路由算法和预测性定位。

Uber的架构按地理区域进行分片,每个城市集群处理自己的匹配,避免了全局瓶颈。理解这一点,可以教会你关于地理分区和区域隔离模式。

2、Google Docs 协作

实时协同编辑需要操作转换来协调并发编辑。当两个用户同时输入时,他们的编辑必须无冲突地合并。

Google的算法相对于彼此转换操作。如果用户A在位置10插入文本,而用户B在位置5删除文本,系统会调整位置以保持一致性。这涉及用于即时同步的WebSocket连接,以及用于更简单属性(如格式)的最后写入胜出冲突解决。

七、内容交付和媒体

1、Spotify 的音乐流媒体

Spotify积极地预缓存音乐,客户端根据播放列表顺序和收听历史预测你接下来会播放什么,然后预取它,这将延迟从几秒减少到几毫秒。

后端对热门内容使用CDN,对较不常见的曲目使用点对点分发。理解Spotify,可以教会你关于预测性缓存、内容分发网络和混合分发策略。

2、WhatsApp 的基础设施

用一个小型工程团队处理每天数十亿条消息,需要简单性。WhatsApp构建在Erlang之上,以利用轻量级进程和容错性,每个连接都是一个进程,使并发变得自然。

消息流经FreeBSD服务器,处理量最小。该架构优先考虑可靠性而非功能。这与功能丰富的平台形成对比,并提供了关于架构简单性的宝贵经验。

八、平台级系统

1、AWS 扩展策略

亚马逊自身的基础设施指导了他们构建AWS的方式。自动扩展组、弹性负载均衡器和多区域部署源于亚马逊的零售运营。

关键的理念是“牲畜 vs 宠物”——即把服务器视为可随时替换的“牲畜”,而不是需要精心命名、特殊照顾的“宠物”。结合不可变基础设施和基础设施即代码,这实现了真正的弹性扩展。

2、ChatGPT 的架构

虽然细节是专有的,但ChatGPT可能使用了跨GPU的模型分片、用于效率的请求批处理以及常见查询的广泛缓存。该系统必须处理不可预测的负载高峰并维护对话上下文。

九、模式识别的回报

研究了这些系统之后,你会注意到模式的出现。缓存失效无处不在,分片以不同的形式出现在数据库、消息队列和地理分布式服务中,速率限制保护着每个公共API。

下次你设计系统时,你就不会从抽象原则开始。你会想:"这类似于Uber匹配司机的方式"或者"我们需要Stripe风格的幂等性"。真实系统提供了理论本身无法提供的思维模型。

作为一名工程师,别再看教科书了,研究你每天使用的系统,你将能急速成长。

作者丨The Latency Gambler 编译丨dbaplus社群

来源丨网址:https://medium.com/@kanishks772/stop-reading-theory-these-18-real-systems-explain-90-of-software-engineering-b37f68c303d9

dbaplus社群欢迎广大技术人员投稿,投稿邮箱:editor@dbaplus.cn

最新评论
访客 2024年04月08日

如果字段的最大可能长度超过255字节,那么长度值可能…

访客 2024年03月04日

只能说作者太用心了,优秀

访客 2024年02月23日

感谢详解

访客 2024年02月20日

一般干个7-8年(即30岁左右),能做到年入40w-50w;有…

访客 2023年08月20日

230721

活动预告