NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

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

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

关注

评论

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

公司给我股份,有什么需要注意的吗?

石云升

创业公司 11月日更

区块链和人工智能是否可以保护森林不再被砍伐?

CECBC

Go语言学习查缺补漏ing Day3

Regan Yue

Go 语言 11月日更

考试试卷存储架构

AHUI

「架构实战营」

Golang Gin 框架上传介绍(四)

liuzhen007

11月日更

21 K8S之容器存储接口CSI

穿过生命散发芬芳

k8s 11月日更

spring的事务隔离级别是何许人也

卢卡多多

Spring Framework 隔离级别 11月日更

Lua-Table

Changing Lin

11月日更

【死磕Java并发】-----J.U.C之AQS:AQS简介

chenssy

11月日更 死磕 Java 死磕 Java 并发

个人博客网站升级

北漂码农有话说

网站

微服务治理之自适应降载

万俊峰Kevin

微服务 微服务架构 服务治理 go-zero Go 语言

Python Qt GUI设计:QPushButton、QRadioButton和QCheckBox按钮类(基础篇—12)

不脱发的程序猿

GUI设计 Python Qt QPushButton QRadioButton QCheckBox

Prometheus Exporter (六)SNMP Exporter

耳东@Erdong

Prometheus snmp exporter 11月日更 snmp Exporter

架构实战营模块四作业

spark99

架构实战营

千万级考试试卷存储方案

张靖

#架构实战营

用AI走出“沙丘”

白洞计划

在线等比数列求和计算器

入门小站

工具

和不安全访问say goodbye,手把手教大家如何给域名申请免费SSL证书

老表

https 云服务器 SSL证书 跟老表学云服务器

主客体建模法

少个分号

linux之拖拽上传文件

入门小站

Linux

hw4-千万级存储方案

WWH

架构实战营

元宇宙:区块链时代的新名字

CECBC

模块四

侠客行

架构实战营 「架构实战营」

GitLab CI/CD 自动化构建与发布实践

Se7en

模块4作业

忘记喝水的猫

架构训练营

模块四作业

心怀架构

040022-week4-design

InfoQ_70156470130f

flutter中的列表的性能优化前奏

坚果

flutter 11月日更

模块四作业 千万级学生管理系统的考试试卷存储方案

小朱

架构实战营

[Pulsar] 一个消息的生命历程(一)

Zike Yang

Apache Pulsar 11月日更

模块四:如何设计业务高性能高可用存储架构?-- 学习总结

小鹿

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