写点什么

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:273866
用户头像

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

关注

评论

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

剧说职场:资深HR告诉你职场强人都有什么特征

雨果

职场

让企业数字化砸锅和IT主管背锅的软件供应链安全风险指北

FinClip

leetcode 605. Can Place Flowers 种花问题 (简单)

okokabcd

数据结构与算法 贪心算法

自定义spring boot starter三部曲之三:源码分析spring.factories加载过程

程序员欣宸

Java springboot 7月月更

TiKV & TiFlash 加速复杂业务查询

TiDB 社区干货传送门

实践案例

活动预告|Apache Doris x Apache SeaTunnel 联合 Meetup 开启报名!

SelectDB

数据库 数据仓库 数据湖 Doris Seatunnel

中国人力资源数字化生态图谱-灵活用工市场

易观分析

人力资源产业

西山居如何用 ONES 打造游戏工业流水线?|ONES 行业实践

万事ONES

什么?你还不知道Symbol?

是乃德也是Ned

JavaScript 7月月更

福昕软件亮相2022年全国化工企业数智化转型发展论坛

联营汇聚

分布式数据库技术前瞻

TiDB 社区干货传送门

数据库架构选型 数据库架构设计

PD-Server GRPC 接口图解

TiDB 社区干货传送门

TiKV 源码解读

了解JVM语言

沃德

Java 程序员 7月月更

【用户文章】P4合并实践指南之实例拆解Resolve

龙智—DevSecOps解决方案

P4合并 解决冲突

什么是主动元数据?为什么Gartner预测它是元数据管理的新方向

雨果

元数据 DaaS数据即服务

知乎高赞:数据中台——风起阿里,成于DaaS

雨果

阿里云 DaaS数据即服务

怎么学习Object.defineProperty | 一篇文章带你们快速学会

bo

JavaScript 前端 7月月更

焱融科技入选北京市 2022 年度“专精特新”,领航混合云文件存储

焱融科技

埃森哲22年《技术展望》报告:数字化转型将迎来下一个十年

雨果

数字化转型

家装工业软件的云挑战

三维家

c++ 云原生 webassembly 云计算, 开源工业软件

想成为精英级开发者?请逼自己养成这10个习惯

雨果

程序员 开发者 精英

AI简报-模型集成 SAM 和SWA

AIWeker

深度学习 7月月更

盘点波卡生态潜力项目 | 跨链特性促进多赛道繁荣

One Block Community

区块链 科技

波卡创始人 Gavin Wood:波卡治理 v2 会有哪些变化?

One Block Community

区块链 科技

在 Polkadot 中进行创建的三种方式 —— 平行链、平行线程、智能合约

One Block Community

区块链 科技

java培训4种Map遍历 key-value 的方法

@零度

JAVA开发 map

数据库每日一题---第23天:游戏玩法分析 l

知心宝贝

数据库 程序员 算法 后端 7月月更

【直播回顾】OpenHarmony知识赋能六期第三课—OpenHarmony智能家居项目之控制面板功能实现

OpenHarmony开发者

OpenHarmony

Linux 环境-TiDB组件进程维度的监控实现

TiDB 社区干货传送门

监控

【容器篇】Docker怎么限制资源使用

技术小生

Docker 7月月更

C# 使用ToolTip控件实现气泡提示

IC00

C# WPF 上位机 7月月更

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