你能在 45 分钟内设计 Netflix 吗?
什么???你是认真的 ?? (我可以看一整夜,但是……)。甚至无法解释 Netflix 的单个组件,而且您要我在短短 45 分钟内设计它??
是的,如果您想在大型科技巨头公司获得梦想的工作,这就是您在系统设计面试中应该做的事情。设计 Netflix 是面试中系统设计回合中一个非常常见的问题。许多候选人更害怕这一轮而不是编码轮,因为他们不知道在有限的时间内应该涵盖哪些主题和权衡。首先,请记住,系统设计回合是非常开放的,没有标准答案之类的东西。即使是同样的问题,不同的面试官也会有完全不同的讨论。
在这个博客中,我们将讨论如何设计一个像 dropbox 或 google drive 这样的网站,但在我们进一步讨论之前,我们希望您阅读文章“如何在面试中破解系统设计?”。你会知道这一轮是什么样的,你在这一轮中应该做什么,在面试官面前你应该避免哪些错误。
Netflix 高层系统架构
我们都熟悉 Netflix 服务。它处理大类电影和电视内容,用户每月支付租金来访问这些内容。 Netflix 在200 多个国家/地区拥有180+M订户。
Netflix 在两个云上工作…… AWS和Open Connect 。这两个云作为 Netflix 的骨干一起工作,并且都高度负责为订阅者提供最好的视频。
该应用程序主要有 3 个组件……
- 客户端:用于浏览和播放 Netflix 视频的设备(用户界面)。电视、XBOX、笔记本电脑或手机等
- OC(Open connect)或Netflix CDN: CDN是分布在不同地理位置的服务器的网络,Open Connect是Netflix自己定制的全球CDN(内容分发网络)。它处理涉及视频流的所有事情。它分布在不同的位置,一旦您点击播放按钮,来自该组件的视频流就会显示在您的设备上。因此,如果您尝试播放位于北美的视频,视频将从最近的开放连接(或服务器)而不是原始服务器(来自最近的服务器的更快响应)提供。
- 后端(数据库) :这部分处理不涉及视频流的所有事情(在您点击播放按钮之前),例如载入新内容、处理视频、将它们分发到位于世界不同地区的服务器以及管理网络流量.大多数流程由 Amazon Web Services 处理。
Netflix 前端是用ReactJS编写的,主要有三个原因:启动速度、运行时性能和模块化。让我们讨论 Netflix 的组件和工作方式。
Netflix 如何载入电影/视频?
Netflix 从制作公司接收非常高质量的视频和内容,因此在将视频提供给用户之前,它会进行一些预处理。 Netflix 支持超过 2200 台设备,每台设备都需要不同的分辨率和格式。为了使视频在不同设备上可见,Netflix 执行转码或编码,包括查找错误并将原始视频转换为不同的格式和分辨率。
Netflix 还为不同的网络速度创建文件优化。当您以高网络速度观看视频时,视频质量很好。 Netflix 使用不同的分辨率为同一部电影创建多个副本(大约 1100-1200)。这些副本需要大量的转码和预处理。 Netflix 将原始视频分成不同的小块,并使用 AWS 中的并行工作器将这些块转换为不同分辨率(如 4k、1080p 等)的不同格式(如 mp4、3gp 等)。
转码后,一旦我们拥有同一部电影的多个文件副本,这些文件就会传输到位于世界各地不同位置的每个 Open Connect 服务器。
当用户在他/她的设备上加载 Netflix 应用程序时,AWS 实例首先出现并处理一些任务,例如登录、推荐、搜索、用户历史记录、主页、计费、客户支持等。之后,当用户点击视频上的播放按钮,Netflix 会分析网络速度或连接稳定性,然后找出离用户最近的最佳 Open Connect 服务器。根据设备和屏幕尺寸,将正确的视频格式流式传输到用户的设备中。在观看视频时,您可能已经注意到视频出现像素化并在一段时间后恢复为高清?发生这种情况是因为应用程序不断检查最佳流媒体开放连接服务器并在需要时在格式之间切换(以获得最佳观看体验)。
用户数据保存在 AWS 中,例如搜索、查看、位置、设备、评论和喜欢,Netflix 使用它为使用机器学习模型或 Hadoop 的用户构建电影推荐。
开放连接优势:
- 更便宜
- 更好的质量
- 更具可扩展性
1. 弹性负载均衡器
Netflix 中的 ELB 负责将流量路由到前端服务。 ELB 执行两层负载平衡方案,其中负载首先在区域上平衡,然后在实例(服务器)上平衡。
- 第一层包括基本的基于 DNS 的循环平衡。当请求到达第一个负载平衡(见图)时,它会在您的 ELB 配置使用的一个区域(使用循环)之间进行平衡。
- 第二层是一组负载均衡器实例,它执行循环平衡技术以将请求分布在同一区域中它后面的实例之间。
2. 祖尔
ZUUL 是一种网关服务,可提供动态路由、监控、弹性和安全性。它提供基于查询参数、URL、路径的简单路由。让我们了解其不同部分的工作原理……
- Netty 服务器负责处理网络协议、Web 服务器、连接管理和代理工作。当请求到达 Netty 服务器时,它将请求代理到入站过滤器。
- 入站过滤器负责身份验证、路由或修饰请求。然后它将请求转发到端点过滤器。
- 端点过滤器用于返回静态响应或将请求转发到后端服务(或我们称之为源)。一旦它收到来自后端服务的响应,它就会将请求发送到出站过滤器。
- 出站过滤器用于压缩内容、计算指标或添加/删除自定义标题。之后,响应被发送回 Netty 服务器,然后由客户端接收。
优点:
- 您可以创建一些规则并通过将流量的不同部分分发到不同的服务器来对流量进行分片。
- 开发者还可以在某台机器上对新部署的集群进行负载测试。他们可以在这些集群上路由一些现有流量,并检查特定服务器可以承受多少负载。
- 您还可以测试新服务。当您升级服务并且想要检查它如何处理实时 API 请求时,在这种情况下,您可以在一台服务器上部署特定服务,并且可以将部分流量重定向到新服务以检查实时服务。
- 我们还可以通过在端点过滤器或防火墙处设置自定义规则来过滤错误的请求。
3.Hystrix
在复杂的分布式系统中,一个服务器可能依赖于另一个服务器的响应。这些服务器之间的依赖性会造成延迟,如果其中一台服务器在某个时刻不可避免地出现故障,则整个系统可能会停止工作。为了解决这个问题,我们可以将主机应用程序与这些外部故障隔离开来。 Hystrix 库旨在完成这项工作。它通过添加延迟容错和容错逻辑来帮助您控制这些分布式服务之间的交互。 Hystrix 通过隔离服务、远程系统和 3rd 方库之间的访问点来做到这一点。图书馆帮助…
- 停止复杂分布式系统中的级联故障。
- 通过第三方客户端库控制访问(通常通过网络)依赖项的延迟和故障。
- 快速失败并快速恢复。
- 在可能的情况下回退并优雅地降级。
- 实现近乎实时的监控、警报和操作控制。
- 并发感知请求缓存。通过请求折叠自动批处理
4. Netflix 微服务架构
Netflix 的架构风格是作为服务的集合而构建的。这被称为微服务架构,它为应用程序和 Web 应用程序所需的所有 API 提供支持。当请求到达端点时,它会调用其他微服务获取所需数据,这些微服务也可以向不同的微服务请求数据。之后,API 请求的完整响应被发送回端点。
在微服务架构中,服务应该是相互独立的,例如视频存储服务将与负责转码视频的服务解耦。现在,让我们了解如何使其可靠……
如何让微服务架构可靠?
- 使用 Hysterix(已经解释过)
- 分离关键微服务:我们可以分离出一些关键服务(或端点或 API),并减少对其他服务的依赖或独立。您还可以使某些关键服务仅依赖于其他可靠服务。在选择关键微服务时,您可以包含所有基本功能,例如搜索视频、导航到视频、点击并播放视频等。这样您就可以使端点高度可用,即使在最坏的情况下至少用户将能够做基本的事情。
- 将服务器视为无状态:这对您来说可能听起来很有趣,但要理解这个概念,请将您的服务器想象成一群奶牛,并且您关心每天获得多少加仑的牛奶。如果有一天你发现你从一头奶牛那里得到的牛奶变少了,那么你只需要用另一头奶牛替换那头奶牛(产奶量减少)。您不需要依赖特定的奶牛来获得所需的牛奶量。
我们可以将上面的例子与我们的应用程序联系起来。这个想法是以这样一种方式设计服务的,如果其中一个端点出现错误或者它没有及时处理请求,那么您可以切换到另一台服务器并完成您的工作。无需依赖特定服务器并保留该服务器中的状态,您可以将请求路由到另一个服务实例,并且您可以自动启动一个新节点来替换它。如果一台服务器停止工作,它将被另一台服务器取代。
5. EV 缓存
在大多数应用程序中,经常使用一定量的数据。为了更快的响应,这些数据可以缓存在许多端点中,并且可以从缓存而不是原始服务器中获取。这减少了来自原始服务器的负载,但问题是如果节点出现故障,所有缓存都会出现故障,这可能会影响应用程序的性能。为了解决这个问题,Netflix 构建了自己的自定义缓存层,称为 EV 缓存。 EV 缓存基于Memcached ,它实际上是 Memcached 的包装器。
Netflix 在许多 AWS EC2 实例中部署了大量集群,这些集群拥有如此多的 Memcached 节点和缓存客户端。数据在同一区域内的集群之间共享,缓存的多个副本存储在分片节点中。每次当客户端写入时,所有集群中的所有节点都会更新,但是当读取发生在缓存时,它只会发送到最近的集群(不是所有集群和节点)及其节点。如果节点不可用,则从不同的可用节点读取。这种方法提高了性能、可用性和可靠性。
6. 数据库
Netflix 使用两种不同的数据库,即 MySQL(RDBMS)和 Cassandra(NoSQL)用于不同的目的。
EC2 部署 MySQL
Netflix 将账单信息、用户信息和交易信息等数据保存在 MySQL 中,因为它需要符合 ACID。 Netflix 对 MySQL 有一个主-主设置,它使用 InnoDB 部署在 Amazon 大型 EC2 实例上。
设置遵循“同步复制协议”,如果写入发生在主主节点上,那么它也会被复制到另一个主节点。仅当主节点和远程主节点写入均已确认时,才会发送确认。这保证了数据的高可用性。
Netflix 为每个节点(本地和跨区域)设置了只读副本。这确保了高可用性和可扩展性。
所有读查询都被重定向到只读副本,只有写查询被重定向到主节点。在主主 MySQL 故障的情况下,辅助主节点将接管主角色,并且数据库的 route53(DNS 配置)条目将更改为这个新的主节点。这也会将写入查询重定向到这个新的主主节点。
卡桑德拉
Cassandra 是一个 NoSQL 数据库,可以处理大量数据,也可以处理大量写入和读取。当 Netflix 开始获得更多用户时,每个成员的观看历史数据也开始增加。这增加了观看历史数据的总数,Netflix 处理如此大量的数据变得具有挑战性。 Netflix 扩展了观看历史数据的存储——在他们的脑海中保留了两个主要目标……
- 更小的存储空间。
- 随着每个成员查看次数的增加,一致的读/写性能(在 Cassandra 中查看历史数据的读写比率约为 9:1)。
完全非规范化数据模型
- 超过 50 个 Cassandra 集群
- 超过 500 个节点
- 超过 30TB 的每日备份
- 最大的集群 72 个节点。
- 1 个集群超过 25 万次写入/秒
最初,观看历史记录存储在 Cassandra 中的一行中。当用户在 Netflix 上开始增加时,行大小以及整体数据大小都增加了。这导致了应用程序的高存储、更高的运营成本和缓慢的性能。这个问题的解决方案是压缩旧行……
Netflix 将数据分为两部分……
- Live Viewing History(LiveVH):该部分包含少量更新频繁的用户近期查看历史数据。数据经常用于 ETL 作业并以未压缩的形式存储。
- 压缩查看历史记录(CompressedVH):本节对大量较旧的查看记录进行了分类,并且很少更新。数据存储在每个行键的单列中,也以压缩形式存储以减少存储空间。
7. 使用 Kafka 和 Apache Chukwa 在 Netflix 中处理数据
当您单击视频时,Netflix 会开始以各种方式处理数据,并且只需不到一纳秒的时间。让我们讨论进化管道如何在 Netflix 上工作。
Netflix 使用 Kafka 和 Apache Chukwe 来摄取在系统不同部分产生的数据。 Netflix 提供将近500B 的数据事件,每天消耗1.3 PB ,在高峰时间消耗 800 万个事件,消耗 24 GB/秒。这些事件包括信息,例如……
- 错误日志
- 用户界面活动
- 演出活动
- 视频观看活动
- 故障排除和诊断事件。
Apache Chukwe是一个开源数据收集系统,用于从分布式系统收集日志或事件。它建立在 HDFS 和 Map-reduce 框架之上。它具有 Hadoop 的可扩展性和健壮性特性。此外,它还包含许多强大而灵活的工具包来显示、监控和分析结果。 Chukwe 从系统的不同部分收集事件,您可以从 Chukwe 进行监控、分析,或者您可以使用仪表板查看事件。 Chukwe 以 Hadoop 文件序列格式 (S3) 写入事件。之后,大数据团队处理这些 S3 Hadoop 文件并以 Parquet 数据格式写入Hive 。这个过程称为批处理,它基本上以每小时或每天的频率扫描整个数据。
为了将在线事件上传到 EMR/S3,Chukwa 还向 Kafka(实时数据处理的大门)提供流量。 Kafka 负责将数据从前端 Kafka 移动到各种接收器:S3、Elasticsearch 和辅助 Kafka。这些消息的路由是使用Apache Samja框架完成的。 Chukwe 发送的流量可以是完整的或过滤的流,因此有时您可能需要对 Kafka 流应用进一步过滤。这就是我们认为路由器从一个 Kafka 主题转移到另一个 Kafka 主题的原因。
8. 弹性搜索
近年来,我们见证了在 Netflix 中使用 Elasticsearch 的巨大增长。 Netflix 运行着大约150个弹性搜索集群和3, 500 个带有实例的主机。
Netflix 正在使用弹性搜索进行数据可视化、客户支持以及系统中的一些错误检测。例如,如果客户无法播放视频,则客户服务主管将使用弹性搜索解决此问题。播放团队转到弹性搜索并搜索用户以了解视频未在用户设备中播放的原因。他们了解该特定用户发生的所有信息和事件。他们了解是什么导致了视频流中的错误。管理员还使用弹性搜索来跟踪某些信息。它还用于跟踪资源使用情况并检测注册或登录问题。
9. Apache Spark 电影推荐
Netflix 使用 Apache Spark 和机器学习进行电影推荐。让我们通过一个例子来了解它是如何工作的。当您加载首页时,您会看到多行不同类型的电影。 Netflix 对这些数据进行个性化处理,并决定应该向特定用户显示什么样的行或什么样的电影。该数据基于用户的历史数据和偏好。此外,对于该特定用户,Netflix 对电影进行排序并计算其平台上可用电影的相关性排名(用于推荐)。
在 Netflix 中,Apache Spark 用于内容推荐和个性化。大多数机器学习管道都在这些大型火花集群上运行。然后使用这些管道进行行选择、排序、标题相关性排名和艺术品个性化等。
艺术品个性化
当您打开 Netflix 首页时,您可能已经注意到每个视频的图像……这些图像称为标题图像(缩略图)。 Netflix 希望用户获得最大的视频点击次数,而这些点击次数取决于标题图像。 Netflix 必须为特定视频选择合适的引人注目的标题图像。为此,Netflix 为特定电影创作了多幅艺术作品,并随机向用户展示这些图像。对于同一部电影,不同用户的图像可能不同。根据您的偏好和观看历史,Netflix 会预测您最喜欢哪类电影或您最喜欢电影中的哪些演员。根据用户的喜好,图像将显示给他们。
例如,假设您在三行中看到 9 张不同的图片,显示您最喜欢的电影 Good will 狩猎(如果您喜欢喜剧,则将显示这部电影的 Robin Williams 图像。如果您喜欢浪漫电影,则 Netflix 将向您显示 Matt 的图像达蒙和米妮司机)。现在,Netflix 会计算特定图像收到的点击次数。如果电影中心图像的点击次数为 1, 500 次,而其他图像的点击次数较少,那么 Netflix 会将中心图像作为电影 Good Will Hunting 的标题图像。这称为数据驱动,Netflix 使用这种方法执行数据分析。为了做出正确的决策,数据是根据与每张图片相关联的视图数量计算的。
视频推荐系统
如果用户想在 Netflix 上发现一些内容或视频,Netflix 的推荐系统可以帮助用户找到自己喜欢的电影或视频。为了构建这个推荐系统,Netflix 必须预测用户的兴趣,并从用户那里收集不同类型的数据,例如……
- 用户与服务的交互(查看历史记录以及用户如何评价其他标题)
- 其他具有相似品味和偏好的成员。
- 用户之前观看过的视频的元数据信息,例如标题、流派、类别、演员、发行年份等。
- 用户的设备,用户在什么时候更活跃以及用户活跃了多长时间。
Netflix 使用两种不同的算法来构建推荐系统……
1.协同过滤:这种过滤的想法是,如果两个用户有相似的评分历史,那么他们在未来的行为也会相似。例如,考虑有两个人。一个人喜欢这部电影并给这部电影打了好分。现在,另一个人很有可能也有类似的模式,他/她会做第一个人做过的事情。
2.基于内容的过滤:这个想法是过滤那些与用户以前喜欢的视频相似的视频。基于内容的过滤高度依赖于来自产品的信息,例如电影名称、发行年份、演员、类型。因此,要实现这种过滤,重要的是要了解描述每个项目的信息,并且还需要某种描述用户喜欢什么的用户配置文件。
GeeksforGeeks 系统设计课程
想在领先的科技公司获得软件开发人员/工程师的工作吗?或 想要从 SDE I 平稳过渡到 SDE II 或高级开发人员配置文件?如果是,那么您需要深入了解系统设计世界!对系统设计概念的正确掌握非常重要,尤其是对于工作专业人士而言,要在技术面试中获得比其他人急需的优势。
这就是为什么 GeeksforGeeks 为您提供以深度面试为中心的系统设计直播课程,帮助您准备与 Google、亚马逊、Adobe、优步和其他基于产品的公司的系统设计相关的问题。