写点什么

Netflix 数据处理架构的演进

  • 2015-02-04
  • 本文字数:1893 字

    阅读完需:约 6 分钟

Netflix 是一家在线影片租赁提供商,该公司连续五次被评为顾客最满意的网站,在过去的 7 年中,Netflix 流媒体服务从偶尔有数千用户在线观看发展到了数百万用户平均每月观看超过 20 亿个小时的规模。Netflix 之所以能够如此成功,离不开对用户行为数据的收集与分析,那么 Netflix 会收集哪些数据,这些数据会用来做什么,其处理架构又是什么呢?本文根据 Netflix 博客上的《 Netflix’s Viewing Data: How We Know Where You Are in House of Cards

》一文整理而来,如果想要查看英文原文请点击这里

事实上,当用户开始在 Netflix 的网站上观看电影或者电视节目的时候,Netflix 的数据系统会创建一个“观看会话(view)”,描述该会话的所有事件信息都会被收集起来。该观看会话数据架构能够应对从用户体验到数据分析的诸多场景,其中最主要的场景有三个:

  • 用户看了哪些视频?系统需要知道每一个用户的所有观看历史,以便于为用户推荐相关的视频内容,同时在页面上的“最近观看”一栏中显示观看历史。用户所看的内容对于用户兴趣的衡量,产品和内容的决定非常重要。
  • 用户从哪里离开了视频?对于每一个电影或者电视节目,Netflix 会记录每一个用户都看到了哪里,从哪个时间点离开的。这使得 Netflix 的用户能够在同一个或者另一个设备上继续观看视频。
  • 当前帐户现在还在观看哪些视频?家庭成员间的帐户共享使得任何人可以在任何时候观看自己喜欢的视频,但是这也意味着当帐户同时在线数超限的时候,必须要有人放弃观看。针对这种场景,Netflix 的观看会话数据系统会收集每一个会话的周期性信号以便于决定某个成员是否还在观看相关视频。

这些场景的实现离不开强大而稳定的数据处理系统,Netflix 目前的系统架构由早期的单数据库应用程序演变而来,当时的主要需求是能够低延迟地为用户提供视频服务,同时还能够处理来自于数百万 Netflix 流设备的快速增长的数据集。在过去 3 年多的时间里,Netflix 一直在不断地改进该架构,现在这套系统每天能够处理千亿左右的事件。

当前的架构图如下:

整个架构最主要的接口是观看会话服务,它分为有状态层和无状态层两部分。有状态层在内存中存有所有活动视图的最新数据。通过对用户帐户 ID 进行 mod N 的模运算,数据被简单地划分为 N 个有状态的节点。当有状态的节点上线的时候,系统会通过一个位置选择流程决定哪部分数据属于它们。所有的持久化数据都存储在 Cassandra 中,在 Cassandra 之上有一个 Memcached 用来保证低延迟的读取路径,但是采用这种方式会话数据有可能会过时,同时如果一个有状态的节点出现了错误,那么 1/n 的浏览数据将不能读写。无状态层的引入正是为了解决这一问题,它提升了系统的可用性,当有状态的节点无法访问的时候,该层会将过时的数据反馈给用户。

但是即使是做了诸多改进,以上架构依然存在一些缺陷:

  • 虽然有状态层使用一个简单的、服从热点分布的分片技术,但是 Cassandra 层并不服从这些热点;同时,如果将其从一个 AWS Region 移动到多个 AWS Region 上运行,那么必须定制一种机制来实现分布在不同 Region 上的状态层之间的状态通信,极大地增加了系统的复杂性。
  • 对于观看会话服务,它封装了会话数据的收集、处理和提供功能,随着系统的演变,功能的增多,该服务的责任也越来越多,增加了运维的难度。
  • 虽然 Memcached 提供了非常好的吞吐量和延迟特性,但是使用一种能够为一等数据类型和操作(例如 append)提供原生支持的技术能够更好地满足相关需求。

为了扩展系统满足下一个数量级的需要,Netflix 正在重新思考自己的基础架构,新系统在设计时考虑的主要设计原则包括:

  • 可用性比一致性更重要。
  • 微服务。对于有状态架构中柔和在一起的组件,根据它们的主要目的分离成单独的服务——或收集、处理或提供数据。将状态管理功能托管到持久化层,让应用程序层无状态,同时组件之间通过事件队列解耦。
  • 混合持久化。使用多种持久化技术,利用每一种方案的优势。使用 Cassandra 实现高容量、低延迟的写。使用 Redis 实现高容量、低延迟的读。

遵循以上原则的新架构实现如下:

当然,这个架构图也仅仅是 Netflix 目前的设计图,至于实现到何种程度了,我们还未可知。Netflix 表示对关键系统进行重新架构以使其能够扩展到下一个数量级是一项非常困难的工作,需要长时间的开发、测试和验证,同时迁移也不是那么容易。但是以这些架构原则为指导,Netflix 相信他们正在构建的下一代系统能够满足自己大规模、快速增长的需要。


感谢郭蕾对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。

2015-02-04 07:273850
用户头像

发布了 321 篇内容, 共 118.7 次阅读, 收获喜欢 19 次。

关注

评论

发布
暂无评论
发现更多内容

DCAT亮相WAIC 2022浦东分会场——元宇宙博览会暨数字光影大会

3DCAT实时渲染

云计算 元宇宙 实时渲染 实时云渲染 云VR

「番外篇」如何用Git平台账号登录建木CI with docker-compose.yml

Jianmu

DevOps 低代码 CI/CD gitops 无代码

抢抓国际标准 中国“原创”企业成国际事务处理性能委员会(TPC)新成员

科技热闻

易周金融分析 | 易观千帆发布7月城商行农商行APP盘点;养老理财产品跨行代销布局提速

易观分析

金融 理财产品

如何进行高效的文档管理?这三点很重要!

Baklib

文档管理 企业文档管理工具

建木持续集成平台v2.5.5发布

Jianmu

开源 DevOps 低代码 CI/CD 无代码

字节Java大神精心编写的《Java开发者面试百宝书》,助你一臂之力!

收到请回复

Java 云计算 开源 架构 编程语言

为什么说企业需要关注客户体验?怎样去提升它?

Baklib

企业 客户体验

「Gitea篇」如何用Git平台账号登录建木CI

Jianmu

DevOps 持续集成 gitops 建木

《OSCAR开源产业大会丨《全球开源生态研究报告(2022年)》重磅发布》

Ada@SegmentFault

中山市等级测评机构有哪些单位?电话号码是多少?

行云管家

等保测评 等级测评 中山市

什么是帮助中心?企业该怎样制作帮助中心页面?

Baklib

企业 帮助中心

C++ 中 Lambda 表达式的快速指南

Java-fenn

Java

Spring 注册 Bean 在配置中的定义和使用 Autowired

HoneyMoose

Maven 中依赖使用的版本号

HoneyMoose

速度与安全可兼得!改造异步布局大幅提升客户端布局性能

小红书技术REDtech

性能优化 安卓 客户端 Andriod

千行百业,可信开源,2022 OSCAR开源产业大会成功召开

Ada@SegmentFault

云管平台的优势有哪些?哪家云管平台好?

行云管家

云计算 云管平台 云管理

谈一谈 build-scripts 架构设计

Java-fenn

Java

MySQL约束和事务知识归纳。

Java快了!

MySQL

元宇宙会议来了,3DCAT助力2022长宁区科技创新主题论坛开展

3DCAT实时渲染

云计算 元宇宙 实时渲染 实时云渲染 云VR

面试必问的AOP,我今天用它实现了系统告警

程序员小毕

spring 源码 程序员 Java 面试 aop

9月大厂Java岗面试原题复盘,双非2年经验成功内推进入阿里!

收到请回复

Java 云计算 开源 架构 编程语言

有关Redis你掌握好这22点,大厂面试基本稳了!

Java全栈架构师

数据库 程序员 后端 Java 面试 redis 底层原理

面试复盘 | 2022届 大疆秋招 测试开发 完整面经

Java-fenn

Java

瑞云科技总经理邹琼出席2022世界人工智能大会投融资主题论坛

3DCAT实时渲染

云计算 元宇宙 实时渲染 实时云渲染 云VR

Wordpress 如何添加 Ads.txt 文件

HoneyMoose

为什么Kubernetes和容器与机器学习密不可分?

京东科技开发者

人工智能 机器学习 Kubernetes 容器 ML

ESP32-C3 VScode开发环境搭建(基于ESP-IDF—Windows和Ubuntu双环境)

矜辰所致

vscode 开发环境 ESP32-C3 9月月更

啃完这32W字的Java程序员面试题,大厂面试分分钟搞定!

收到请回复

Java 云计算 开源 架构 编程语言

利用Python开发App实战

千锋IT教育

Netflix数据处理架构的演进_架构_孙镜涛_InfoQ精选文章