菜单

真实案例研究

相关源文件

目的与范围

本文档全面概述了各大科技公司的真实系统设计案例。这些案例研究展示了系统设计的理论概念如何在实际生产环境中应用,为驱动当今一些最流行应用程序和服务的架构决策、扩展策略和技术栈选择提供了宝贵的见解。

本文档的范围涵盖了架构演进、数据库扩展、内容分发优化、消息存储以及其他大型系统关键方面,涉及Netflix、Twitter、Airbnb、Discord等公司。

有关具体人工智能和机器学习实现的更多信息,请参阅人工智能与机器学习。有关DevOps和CI/CD管道的详细信息,请参阅DevOps与CI/CD

案例研究概览

本合集中的真实案例研究展示了公司如何大规模解决复杂的技术挑战。这些例子将理论知识与实际实现相结合,为系统设计决策提供了具体的参考。

来源: README.md78-110

架构演进

Netflix 的整体架构

Netflix 的架构展示了一种现代化的云原生方法,可在全球范围内提供流媒体内容。该系统旨在实现高可用性、全球分发和高效的内容交付。

关键架构组件

  • API 网关:管理所有客户端请求并将其路由到相应的微服务
  • EVCache:内存缓存,用于高性能数据访问
  • 微服务:用于特定功能的独立服务(推荐、播放、用户管理)
  • 全球 CDN:分布式内容分发网络,用于从边缘位置提供内容
  • Cassandra:NoSQL 数据库,用于高可用性和分区容错

来源: README.md96-97 README.md92-93 README.md94-95 README.md98-99 README.md110

Airbnb 从 0 到 15 亿用户的增长历程

随着平台用户增长到 15 亿,Airbnb 的架构从一个单一的 Ruby on Rails 应用演进为一个复杂的微服务架构。

关键演进里程碑

  • 初始单体应用:处理所有功能的单一 Ruby on Rails 应用
  • 面向服务架构:将支付和搜索等关键组件剥离
  • 微服务架构:进一步分解为专业化服务
  • 搜索演进:从基础数据库查询到复杂的搜索基础设施
  • 数据平台:开发了一个全面的数据湖,用于分析和机器学习

来源: README.md94-95 README.md100-101

数据库扩展

Figma 100 倍的 Postgres 扩展

Figma 通过一系列战略优化技术,实现了 PostgreSQL 数据库 100 倍的扩展,同时保持了对协作设计工作的可靠性能。

关键扩展技术

  • 查询优化:重写低效查询并添加适当的索引
  • 连接池:高效管理数据库连接
  • 表分区:将大表分割成可管理的小块
  • 读副本:将读负载分发到多个数据库实例
  • 缓存层:实现应用层缓存以减少数据库负载

来源: README.md79

Pinterest 的克隆时间优化

Pinterest 通过一次代码更改,将克隆时间大幅缩短了 99%,这表明看似微小的优化也能产生显著的性能影响。

关键优化技术

  • 浅克隆:实现 git 深度过滤器,避免克隆完整的仓库历史记录
  • 影响:将克隆时间缩短到原始时间的 1%
  • 实施工作量:仅需一次代码更改

来源: README.md81-82

内容分发与处理

YouTube 如何处理海量视频上传

YouTube 每分钟处理数百小时的视频上传,通过一个专为可扩展性和高效内容分发设计的复杂处理流程。

关键系统组件

  • 上传服务:处理用户上传的初始视频摄入
  • 处理队列:管理视频处理任务的工作流程
  • 转码服务:将视频转换为多种格式和分辨率
  • 内容验证:检查版权问题和违规行为
  • CDN 分发:将处理后的视频分发到全球边缘位置

来源: README.md90-91

Netflix 的缓存策略

Netflix 采用复杂的缓存策略,以确保全球数百万用户的流畅流媒体体验,降低延迟和带宽成本。

关键缓存策略

  • Open Connect Appliances (OCAs):部署在 ISP 的定制边缘缓存服务器
  • EVCache:用于元数据和用户信息内存分布式缓存
  • 客户端缓存:设备上的本地缓存,用于频繁访问的内容
  • API 响应缓存:缓存 API 响应以减少后端负载

来源: README.md92-93

消息和存储系统

Discord 如何存储数万亿条消息

Discord 的系统架构支持低延迟地存储和检索数万亿条消息,为数百万用户提供实时通信支持。

关键系统组件

  • Cassandra 数据库:消息数据的主要存储,因其可扩展性而被选用
  • 基于频道的 Sharding:消息根据频道 ID 进行分片
  • 基于时间的 Partitioning:数据按时间进行分区以实现高效访问
  • 热/冷存储策略:近期消息存储在热存储中,较旧的消息存储在冷存储中
  • Elasticsearch:用于消息搜索功能

来源: README.md107

Slack 的消息旅程

Slack 的架构处理和传递跨设备和团队的消息,同时保持一致性、历史记录和搜索功能。

关键系统组件

  • 消息服务:用于接收和处理消息的核心组件
  • 验证与增强:处理消息以添加元数据、链接等
  • 实时消息:即时将消息发送到连接的客户端
  • 搜索索引:使消息能够在频道和历史记录中进行搜索
  • 多客户端支持:在不同客户端平台之间同步消息

来源: README.md103

API 层演进

Netflix API 架构的演进

Netflix 的 API 架构从单体 API 演进为一个复杂的系统,旨在支持数百种功能各异的设备。

关键演进方面

  • 从单体到网关:从单个 API 过渡到 API 网关架构
  • 边缘计算:实现边缘服务以提高响应时间
  • 设备适配:为不同的设备功能创建专门的 API
  • GraphQL 采用:实施 GraphQL 以进行更灵活的数据查询
  • 微服务后端:用微服务取代了单体后端

来源: README.md106

Uber API 层演进

Uber 的 API 架构不断发展,以支持其不断增长的交通和配送服务平台,重点是全球规模的可靠性和性能。

关键架构组件

  • API 网关:所有客户端请求的中央入口点
  • 领域特定服务:针对不同业务功能的专业化微服务
  • 身份验证与速率限制:用于安全和稳定性的集中式服务
  • 负载均衡:将请求分发到服务实例
  • 客户端专业化:不同的客户端应用程序与相同的后端服务通信

来源: README.md109

技术栈

Netflix 技术栈

Netflix 采用全面的技术栈,旨在实现全球规模、高可用性和持续部署。

技术栈
前端React, JavaScript, Node.js
APINode.js, Java
微服务Java, Python, Node.js
数据处理Spark, Flink, Kafka
数据库Cassandra, EVCache, MySQL
CI/CDSpinnaker, Jenkins
流式传输自定义协议, 自适应比特率流
监控Atlas, CloudWatch
基础设施AWS (EC2, S3, DynamoDB)

关键技术栈特征

  • Java 主导:核心服务主要基于 Java 构建
  • 云原生:完全部署在 AWS 基础设施上
  • 自定义工具:在自定义工具方面投入巨大
  • 开源:众多开源项目的贡献者
  • 微服务架构:数百个独立的服务

来源: README.md110 README.md99 README.md93

Uber 技术栈

Uber 的技术栈支撑其交通平台,重点是可靠性、实时运营和全球规模。

技术栈
前端Node.js, React, Swift, Kotlin
后端Go, Java, Python
数据库MySQL, PostgreSQL, Schemaless (NoSQL)
消息传递Kafka, Cherami
缓存Redis, Memcached
Map专有地图技术
CI/CD自定义部署系统
监控Prometheus, Jaeger
基础设施混合云和本地部署

关键技术栈特征

  • Go 语言:在微服务中广泛采用
  • 地理空间焦点:在地图和定位技术方面投入巨大
  • 实时处理:用于实时匹配和 ETA 的专业系统
  • 微服务架构:数千个微服务
  • 自定义工具:开发了许多内部工具和框架

来源: README.md86-87 README.md105

Twitter 技术栈

Twitter 的技术栈从单体 Ruby on Rails 应用演进为一个复杂的分布式系统,能够处理每天数亿条推文。

技术栈
前端JavaScript, React, Node.js
后端Scala, Java, C++
实时处理Storm, Heron
数据库Manhattan (NoSQL), MySQL, Redis
搜索Lucene, Earlybird
缓存Redis, Memcached
消息传递Kafka, EventBus
存储HDFS, Blobstore
基础设施混合云和本地部署

关键技术栈特征

  • Scala 采用:从 Ruby 迁移到 Scala 以提高性能
  • 自定义数据库:开发 Manhattan NoSQL 数据库
  • 实时处理:自定义流处理框架
  • 搜索基础设施:用于推特的专业搜索引擎
  • 时间线服务:用于生成时间线的复杂服务

来源: README.md88-89 README.md108

结论

这些真实世界的案例研究展示了领先的技术公司如何实施、扩展和演进其系统以满足不断增长的需求。这些示例中阐述的架构模式、扩展技术和技术选择,为处理类似挑战的系统设计师和工程师提供了宝贵的见解。

这些案例研究中普遍存在的模式包括:

  1. 从单体架构向微服务架构的演进
  2. 在多个层面大力投资缓存策略
  3. 为公司特定需求定制解决方案
  4. 采用分布式数据库和存储系统
  5. 强调实时数据处理
  6. 持续部署和基础设施自动化

这些模式突显了系统设计原则在解决现实世界中的扩展性和可靠性挑战方面的实际应用。