计划
拥有它非常重要。即使您在某个地方犯了一个错误并在推理中采用了错误的方式,整个结构化的方法也将掌握在您的手中。在开始时,您可以略微直言不讳,并向受访者询问详细信息,但是从某个角度(在我的计划中对应于第3点)开始,您应该完全有主动权,最好不要放任自流。我的计划是这样的:
- 收集关键功能列表,并将其写在面板的一角。这个简单的技巧将帮助您记住重要的约束条件或假设。
- 了解系统应具备的技术特征:预期的RPS,可接受的响应时间范围,在一致性和可靠性方面的预期。
- 构建最简单的单机解决方案,以某种方式工作。无需从全球20个数据中心开始,最好逐步采用它。
- 查找单点故障或性能瓶颈。
- 提供解决问题的一个或多个选项,清楚说明每个选项的利弊
- 选择一个选项,然后转到步骤4,如果还有时间,并且如果结束,则转到下一个项目
- 估计存储大小,服务器数量,网络带宽,仔细写下来
- 奖励:谈论其他功能,机器学习实施,产品指标,实验
时间控制非常重要。我尝试在前两点上花5-10分钟,在后两点上花5分钟。
权衡
即使看起来很明显,也需要说出它们。引入任何新部分之后,重要的是要说类似“我们添加了一个新元素,这可以解决这样的问题,但是我们会为此付费”。权衡可以是这样的:
- 任何新的系统组件或现有备件数量的增加都解决了负载/响应速度问题,但在支持和部署方面却令人头疼。
- 分片解决了负载和空间限制,但将来会增加重新分片的问题。
- 复制存储解决了负载和可靠性问题,但是在读取和写入副本的情况下,它使您考虑烂值和可用性和一致性的对立
- 缓存解决了负载问题,但让您考虑了腐臭值和缓存一致性。
- 您可以轻松修改和优化您自己的解决方案,但是您必须首先编写它。
- 现有解决方案的好处是它已经存在,但是您必须弄清楚它。
号码
每个人都知道每个程序员都应该知道的延迟数,但是我认为,链接上的数字并不是以最方便的方式构建的,为了便于记忆,我在准备过程中对它们进行了重新格式化。
最终,以下几点很重要:
- 了解从不同级别的处理器缓存,内存,SSD,HDD和网络读取数据所花费的时间。
- 记住数据中心内部和全球范围内的往返时间,以及人们感知的最小延迟(〜100ms)。
- 为了能够快速将字节转换为千兆字节,将纳秒转换为秒等,我在练习过程中自行开发了此技能。
实践
我购买了白板,使用了现有服务,并试图弄清如何从头开始制作它们。我在板上绘制了图表,弄清了负载和必要的资源,寻找了设计中的薄弱环节。我也有很多好朋友,我们与他们安排了伪造的部分并互相培训,这是一次非常有益的经历。练习之后,您可以上网查看其实际操作,然后重试。经过10到20轮不同的服务后,现有系统中的启蒙装置和重复出现的零件开始清晰可见。备件可以是,例如:
- 搜索(最好具有实时更新索引的能力)
- (gfs, haystack)
- kv- (cassandra, dynamo)
- Message queue pub-sub (kafka)
- (twitter, instagram, facebook)
- , , - (whatsapp, telegram, battle.net)
- , - (skype, twitch, youtube)
- Grokking the system design interview. , , .
- System design primer. , .
- ( ). . , , .
- 多种高扩展性
- 好吧,最重要的资源是您的朋友和熟人,他们知道他们的系统如何工作并可以向您介绍它们。
几个不错的视频和频道
1.可伸缩性
2.架构和系统设计面试入门
3.四种分布式系统架构模式
4. 2012年的Dropbox
5.松弛
6. Twitter
7. Reddit
8. Instagram
9. Youtube在2007年
10.同胞关于系统设计的渠道
11 。另一个频道
12.另一个频道
如果您没有困难的时间,但是访问的前景已经迫在眉睫,那么最正确的策略就是在大型系统主题的背景下不断阅读/查找某些内容。算法难题也是如此:定期解决它们并保持良好状态比尝试在面试前的周末掌握整个代码要好。但是,在短时间内为建筑部分做大量准备工作使我成为了一名更好的专家。