如何设计系统
如何设计系统
系统设计过程
步骤一、约束和用例
对于任何系统设计,第一件应该做的事是:阐明系统的约束并确定系统需要满足哪些用例。
永远不要假设没有明确说明的事情。一定要尽力收集、理解需求,并设计一个很好地涵盖这些要求的解决方案。
例如,URL 缩短服务可能只为几千个用户提供服务,但每个用户都可能共享数百万个 URL。它可能旨在处理对缩短的 URL 的数百万次点击或数十次点击。该服务可能必须提供有关每个缩短的 URL 的大量统计信息(这会增加您的数据大小),或者可能根本不需要统计信息。
您还必须考虑预期会发生的用例。您的系统将根据其预期功能进行设计。不要忘记确保你知道面试官一开始没有告诉你的所有要求。
步骤二、顶层设计
一旦确定了要设计的系统的范围,接下来就要做顶层设计:概述系统架构中所需的所有重要组件。
此时,应该绘制出主要组件以及它们之间的连接。通常,这种顶层设计是基于主流技术的组合。这就要求设计必须熟悉这些技术,了解其利弊以及适合使用的场景。
步骤三、分析瓶颈
顶层设计很可能会遇到一个或多个瓶颈。这完全没问题,不要指望一个新系统可以立即处理世界上的所有负载。它只需要可扩展,以便您能够使用一些标准工具和技术对其进行改进。
现在有了顶层设计,就要考虑这些组件在系统扩展时面临的瓶颈。也许,系统需要一个负载均衡器和集群来处理用户请求。或者,由于数据容量庞大,以至于需要将数据库分库分表(分布在多台机器上)。这些方案有什么利弊,是否适用?数据库是否太慢,是否需要一些内存缓存?
通常每个解决方案都是某种权衡和取舍。改变某事会使其他事情恶化。然而,重要的是能够讨论这些权衡,并根据定义的约束和用例来衡量它们对系统的影响。
一旦分析清楚核心瓶颈,就可以着手在下一步中去解决它们。
步骤四、扩展设计
首先,你需要了解以下技术手段:
- 垂直扩展
- 水平罗占
- 缓存
- 负载均衡
- 数据库复制
- 数据库分区
- 异步
- NoSql
在系统设计方面,回顾现实中的架构非常有用。注意使用了哪些技术。继续研究每一项新技术,看看它解决了什么问题,它的替代品是什么,它擅长的地方,以及失败的地方。
一切都是权衡的结果——这是系统设计中最基本的概念之一。
一些推荐的学习资料
- 生产中的深度学习:关于 EyeEm 如何构建在大量图像上运行多个深度学习模型的生产系统的精彩故事
- Uber:一篇关于 Uber 如何快速扩展的好文章,关于将您的服务分解为分布在许多存储库中的许多微服务。
- Facebook:Facebook 如何在直播中同时处理 800,000 名观众
- Kraken.io:如何大规模缩放图像优化,本文将更详细地看一些具体使用的硬件方案,以及部署、监控等重要方面
- Twitter:Twitter 如何处理每秒 3,000 张图片上传以及为什么它使用的旧方式现在行不通
- 最后,Twitter 子组件的一些很好的例子:存储数据(video | text)和时间轴(video | text)。
- 有关更高级的示例,请查看 Google、Youtube(video | text)、Tumblr、StackOverflow 和 Datashift 上的这些帖子。