通知服务
为了保持文件的一致性,在本地执行的文件的任何变化都需要通知其他客户端以减少冲突。通知服务就是为此而构建的。在高层次上,通知服务允许在事件发生时将数据传输到客户端。下面是几个选项:
长轮询。Dropbox 使用长轮询[10]。
网络插座。WebSocket 提供了客户端和服务器之间的持久连接。交流是双向的。
尽管这两个选项都工作得很好,但我们选择长轮询有以下两个原因:
通知服务的通信不是双向的。服务器向客户端发送有关文件更改的信息,但反之亦然。
web socket 适用于实时双向交流,比如聊天应用。对于 Google Drive,通知很少发送,没有数据突发。
使用长轮询,每个客户端建立一个到通知服务的长轮询连接。如果检测到对文件的更改,客户端将关闭长轮询连接。关闭连接意味着客户端必须连接到元数据服务器才能下载最新的更改。收到响应或连接超时后,客户端会立即发送新的请求来保持连接打开。
节省存储空间
为了支持文件版本历史并确保可靠性,同一文件的多个版本存储在多个数据中心。频繁备份所有文件修订会很快填满存储空间。提出了三种技术来降低存储成本:
删除重复数据块。在帐户级别消除冗余块是节省空间的简单方法。如果两个块具有相同的哈希值,则它们是相同的。
采用智能数据备份策略。可以应用两种优化策略:
设置限制:我们可以设置存储版本数量的限制。如果达到限制,旧版本将被新版本替换。
只保留有价值的版本:有些文件可能会经常编辑。例如,为大量修改的文档保存每个编辑过的版本可能意味着该文件在短时间内被保存 1000 次以上。为了避免不必要的拷贝,我们可以限制保存版本的数量。我们更重视最近的版本。实验有助于找出要保存的最佳版本数量。
将不常用的数据移动到冷存储。冷数据是几个月或几年没有活动的数据。像亚马逊S3
冰川[11]这样的冷库比S3
便宜多了。
故障处理
大规模系统中会出现故障,我们必须采用设计策略来解决这些故障。你的面试官可能有兴趣听听你是如何处理以下系统故障的:
负载均衡器故障:如果一个负载均衡器出现故障,辅助负载均衡器将变为活动状态,并接管流量。负载平衡器通常使用心跳来相互监控,心跳是负载平衡器之间发送的周期性信号。如果负载平衡器在一段时间内没有发送心跳信号,则被视为失败。
块服务器故障:如果一个块服务器发生故障,其他服务器会接管未完成或未完成的任务。
云存储失败:S3
桶在不同地区多次复制。如果文件在一个区域不可用,可以从不同的区域获取。
API 服务器故障:是无状态服务。如果一个 API 服务器出现故障,负载均衡器会将流量重定向到其他 API 服务器。
元数据缓存故障:元数据缓存服务器被多次复制。如果一个节点出现故障,您仍然可以访问其他节点来获取数据。我们将启用一个新的缓存服务器来替换出现故障的服务器。
元数据数据库故障。
主节点关闭:如果主节点关闭,提升其中一个从节点作为新的主节点,并启动新的从节点。
从服务器宕机:如果一个从服务器宕机,您可以使用另一个从服务器进行读取操作,并使用另一个数据库服务器来替换出现故障的服务器。
通知服务失败:每个在线用户与通知服务器保持长时间的轮询连接。因此,每个通知服务器都与许多用户连接。根据 Dropbox 2012 年的报告[6],每台机器上有超过 100 万个连接处于打开状态。如果服务器关闭,所有长轮询连接都将丢失,因此客户端必须重新连接到不同的服务器。即使一台服务器可以保持许多打开的连接,它也不能一次重新连接所有丢失的连接。与所有丢失的客户重新联系是一个相对缓慢的过程。
离线备份队列失败:队列被多次复制。如果一个队列失败,该队列的使用者可能需要重新订阅备份队列。
第四步——总结
在本章中,我们提出了一个支持 Google Drive 的系统设计。强一致性、低网络带宽和快速同步的结合使设计变得有趣。我们的设计包含两个流程:管理文件元数据和文件同步。通知服务是系统的另一个重要组成部分。它使用长轮询来使客户端及时了解文件更改。
和任何系统设计面试问题一样,没有完美的解决方案。每个公司都有其独特的限制,你必须设计一个系统来适应这些限制。了解设计和技术选择的权衡非常重要。如果还有几分钟,你们可以谈谈不同的设计选择。
例如,我们可以从客户端直接将文件上传到云存储,而不是通过块服务器。这种方法的优点是它使文件上传更快,因为文件只需要传输一次到云存储。在我们的设计中,文件首先传输到块服务器,然后传输到云存储。然而,新方法有一些缺点:
首先,必须在不同的平台(iOS、Android、Web)上实现相同的分块、压缩、加密逻辑。它容易出错,需要大量的工程工作。在我们的设计中,所有这些逻辑都在一个集中的地方实现:块服务器。
其次,由于客户端很容易被黑客攻击或操纵,在客户端实现加密逻辑并不理想。
系统的另一个有趣的发展是将在线/离线逻辑转移到一个独立的服务中。让我们称之为现场服务。通过将在线服务移出通知服务器,在线/离线功能可以很容易地被其他服务集成。
祝贺你走到这一步!现在给自己一个鼓励。干得好!
参考资料
[1] Google Drive: https://www.google.com/drive/ [2] Upload file data: https://developers.google.com/drive/api/v2/manage-uploads [3] Amazon S3: https://aws.amazon.com/s3 [4] Differential Synchronization https://neil.fraser.name/writing/sync/ [5] Differential Synchronization youtube talk https://www.youtube.com/watch?v=S2Hp_1jqpY8 [6] How We’ve Scaled Dropbox: https://youtu.be/PE4gwstWhmc [7] Tridgell, A., & Mackerras, P. (1996). The rsync algorithm. [8] Librsync. (n.d.). Retrieved April 18, 2015, from https://github.com/librsync/librsync [9] ACID: https://en.wikipedia.org/wiki/ACID [10] Dropbox security white paper: https://www.dropbox.com/static/business/resources/Security_Whitepaper.pdf [11] Amazon S3 Glacier: https://aws.amazon.com/glacier
十六、继续学习
设计好的系统需要多年的知识积累。一个捷径是深入现实世界的系统架构。以下是一些有用的阅读材料。我们强烈建议您关注共享原则和底层技术。研究每项技术并了解它能解决什么问题,这是巩固您的知识基础和优化设计流程的一个好方法。
现实世界的系统
以下资料可以帮助你了解不同公司背后真实系统架构的一般设计思路。
https://goo.gl/FCNrbm 时间线:用反规范化的力量带给你:
建筑时间轴:放大到容纳你的人生故事:goo.gl/8p5wDV
二郎在脸书(脸书聊天):
大海捞针:脸书的照片储存:goo.gl/edj4FL
服务脸书多馈:通过重新设计提高效率和性能:
在 https://goo.gl/rZiAhX 脸书T3扩展 Memcache
陶:的社交图分布式数据存储:
亚马逊架构:goo . GL/k4 feow
迪纳摩:亚马逊高可用键值商店:goo.gl/C7zxDL
整个网飞栈的 360 度视图:
都是测试:网飞实验平台:goo.gl/agbA4K
https://goo.gl/A4FkYi 推荐:超越 5 星(上):
https://goo.gl/XNPMXm 推荐:超越 5 星(下):
谷歌架构:goo.gl/dvkDiY
谷歌文件系统(Google Docs):
差分同步(Google Docs):
YouTube 体系结构:goo . GL/mcfre
西雅图可扩展性会议:YouTube 可扩展性:goo.gl/dH3zYq
Bigtable:结构化数据的分布式存储系统:goo.gl/6NaZca
Instagram 架构:1400 万用户,TB 级照片,100 个实例,几十种技术:goo.gl/s1VcW5
【Twitter 用来应对 1.5 亿活跃用户的架构:goo.gl/EwvfRd
缩放 Twitter:让 Twitter 快一万倍:goo.gl/nYGC1k
宣布雪花(雪花是一种大规模生成唯一 ID 号的网络服务,有一些简单的保证):goo.gl/GzVWYm
时间轴缩放:goo.gl/8KbqTy
优步如何扩展其实时市场平台:goo.gl/kGZuVy
缩放 Pinterest:
Pinterest 体系结构更新:goo . GL/w6 rrf
缩放 LinkedIn 简史:goo.gl/8A1Pi8
Flickr 体系结构:goo . GL/dwtgya
我们如何缩放 Dropbox:goo.gl/NjBDtC
脸书以 190 亿美元买下的 WhatsApp 架构:
公司工程博客
如果你要去一家公司面试,阅读他们的工程博客,熟悉那里采用和实施的技术和系统是个好主意。此外,工程博客提供了某些领域的宝贵见解。定期阅读它们可以帮助我们成为更好的工程师。
以下是知名大公司和创业公司的工程博客列表。
Airbnb:medium.com/airbnb-engineering
亚马逊:developer.amazon.com/blogs
体式:
大西洋:developer.atlassian.com/blog
Bittorrent:engineering.bittorrent.com
cloud era:blog.cloudera.com
码头工人:blog.docker.com
Dropbox:blogs.dropbox.com/tech
GitHub:githubengineering.com
Groupon:engineering.groupon.com
高可扩展性:
insta cart:tech.instacart.com
insta gram:engineering.instagram.com
领英:engineering.linkedin.com/blog
网飞:medium.com/netflix-techblog
支付宝:www.paypal-engineering.com
Pinterest:engineering.pinterest.com
Quora:engineering.quora.com
Reddit:Reddit blog . com
sales force:developer.salesforce.com/blogs/engineering
Shopify:engineering.shopify.com
Slack:Slack . engineering
Soundcloud:developers.soundcloud.com/blog
Spotify:labs.spotify.com
条纹:
系统设计初级读本:
碎碎念:blog.twitter.com/engineering/en_us.html
图钉:www.thumbtack.com/engineering
优步:eng.uber.com
缩放:medium.com/zoom-developer-blog
补充阅读
软件工程面试很有挑战性,但好消息是正确的准备会带来很大的不同。一次技术面试通常涵盖这些领域中的一个:编码、系统设计或面向对象设计。为了帮助你找到一份理想的工作,我们整理了一份可能对你有帮助的书单。
了解分布式系统 罗伯特·维蒂洛
这本书教授分布式系统的基础知识。作者很好地解释了网络堆栈、数据一致性模型、弹性、可伸缩性和可靠性模式等等。链接:
由内而外的科技简历Gergely Orosz
一份出色的简历是你从众多竞争对手中脱颖而出的通行证。这本书的内容经过精心研究,旨在帮助你制作一份看起来专业的简历。最棒的部分:作者联系了几十位经验丰富的技术招聘人员和亲身实践的招聘经理,以确保这本书是有用的,事实上是正确的。充分披露:我个人认识他。链接:
设计数据密集型应用 马丁·克莱普曼
这本 616 页的经典书籍被认为是致力于分布式系统的工程师们的必读之作。最好的部分:这本书技术性很强,包含了很多关于可伸缩性、一致性、可靠性、效率和可维护性的深入讨论。链接:
免责声明:我只推荐我读过的书。此部分包含附属链接。如果你用这些链接买东西,我们可能会赚一小笔佣金。谢了。
十七、后记
恭喜你!您已到达本面试指南的末尾。你已经积累了设计系统的技能和知识。不是每个人都有学习你所学的东西的纪律。花点时间拍拍自己的背。你的努力会有回报的。
找到一份理想的工作是一个漫长的旅程,需要大量的时间和努力。熟能生巧。祝你好运!
感谢您购买和阅读这本书。没有你这样的读者,我们的工作就不会存在。我们希望你喜欢这本书!
如果你不介意,请在亚马逊上阅读这本书:bit.ly/sysreview8
它将帮助我吸引更多像你这样的优秀读者。
加入邮件列表
我们即将完成 10 多个真实世界的系统设计面试问题。如果你想在新章节出现时得到通知,请订阅我们的电子邮件列表:bit.ly/systemmail
加入社区
我创建了一个仅限成员的不和小组。它旨在针对以下主题进行社区讨论:
系统设计基础。
展示设计图并获得反馈。
找模拟面试的哥们。
与社区成员一般聊天。
立即加入我们,点击下面的链接或扫描条形码,向社区介绍自己。
如果您对本书有任何意见或疑问,欢迎发送电子邮件至 systemdesigninsider@gmail.com
。此外,如果您发现任何错误,请让我们知道,以便我们在