前几年阅读了很多有关分布式系统、数据结构和可扩展性模式的教科书,终于可以解释 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 的幂等性

防止重复计费对支付系统至关重要。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
如果字段的最大可能长度超过255字节,那么长度值可能…
只能说作者太用心了,优秀
感谢详解
一般干个7-8年(即30岁左右),能做到年入40w-50w;有…
230721