开了个新坑,近期从 Instagram 的广告上得知了 ByteByteGo,并且订阅了他们的简报(Newsletter)服务,基本上隔个两三天就会收到他们的简报邮件。其中有些简报让我非常感兴趣,故分享。

2024 年 06 月 25 日:Netflix 如何管理 2.38 亿会员?(How Netflix Manages 238 Million Memberships?)

如果侵权,请联系我删除!

简报内容

免责声明:本文章中的细节来自 Netflix 工程团队的文章/演讲。所有架构细节均归功于 Netflix 工程团队。原文链接见文末参考文献部分。我们尝试分析了这些细节,并提供了我们的意见。如果您发现任何不准确或遗漏之处,请留下评论,我们将尽力修正。

作为一家基于订阅的流媒体服务公司,Netflix 的主要收入来源是会员业务。目前,Netflix 在全球拥有 2.38 亿名会员,有效管理会员对公司的成功和持续增长至关重要。

Netflix 的会员平台在处理用户订阅的整个生命周期中发挥着至关重要的作用。

会员生命周期由不同阶段和场景组成:

  • 注册: 用户可直接或通过 T-Mobile 等合作伙伴渠道注册 Netflix 服务,开始 Netflix 之旅。
  • 计划变更: 现有会员可根据自己的喜好和需求修改订阅计划。
  • 续订: 作为一项订阅服务,Netflix 会自动尝试使用与用户账户相关联的付款方式为用户续订计划。
  • 付款问题: 如果支付网关出现问题或资金不足,用户的账户可能会被暂停或给予宽限期来解决问题。
  • 会员资格暂停或取消: 用户可以选择暂时中止会员资格或永久取消订阅。

在下面的章节中,我们将探讨 Netflix 工程团队为支持其会员平台的各种功能和可扩展性而做出的架构决策。

Netflix 会员平台的高级架构

在深入了解 Netflix 会员制平台的细节之前,让我们先回顾一下该公司最初的定价架构是如何设计的。

早期,Netflix 的定价模型相对简单,只需管理少量计划和支持基本功能。

为了满足这些最初的要求,Netflix 采用了轻量级的内存库。事实证明,这种方法相当高效,因为定价系统的范围有限,因此设计简单、精简。

下图展示了这一基本架构:

Netflix服务
会员服务
Netflix计划和定价库
Netflix定价服务初步设计

随着 Netflix 全球业务的扩展和产品的多样化,最初为定价架构提供服务的轻量级内存库变得不敷使用。

定价目录的复杂性和范围不断扩大,其在多个应用程序中的重要性也与日俱增,这给运营带来了挑战。该库的规模和依赖性使其难以维护和扩展,因此有必要过渡到更强大和可扩展的架构。

下图显示了 Netflix 现代会员制平台的高层架构:

会员宽限期服务
会员状态管理服务
订阅服务

Cassandra
订阅数据库

Cassandra
订阅历史数据库

Apache Spark对账工作
订阅历史服务
kafka
会员捆绑包服务
会员应用商店服务
会员定价服务
计划定价目录服务

CockroachDB
计划和定价表

代码兑换服务

CockroachDB
代码兑换表

Netflix会员制服务的架构

会员平台由十几个微服务组成,旨在支持四个九(99.99%)的可用性。

这种高可用性要求源于该平台在各种面向用户的流程中发挥的关键作用。如果任何服务出现宕机,都会直接影响用户体验。

该平台支持多个关键功能:

  • 当用户点击 Netflix 上的播放按钮时,会直接呼叫会员系统,以确定与其计划相关的服务质量。用户允许的并发流和支持的设备等因素都在考虑之列。由于 Netflix 每天都要处理数十亿个流媒体请求,因此该流程处理的流量最大。
  • 当用户访问其账户页面时会触发会员流。更改计划、管理额外会员和取消会员资格等操作会直接与会员服务交互。
  • 该平台是任何特定时间点会员总数的权威来源。它发出事件并写入持久存储,Netflix 内部和外部的下游分析系统都会使用该存储。

架构图的要点如下:

  • 会员平台在全球范围内管理会员计划和定价目录,不同地区的计划和定价目录各不相同。计划定价目录服务处理基于特定地点产品的规则管理。
  • 两个 CockroachDB 数据库用于存储计划定价和代码兑换信息。会员定价服务支持会员操作,如更改计划或添加额外会员。
  • 专门的微服务负责处理与合作伙伴的互动,包括捆绑激活、注册以及与苹果应用商店等平台的集成。
  • 会员数据存储在 Cassandra 数据库中,该数据库支持订阅服务和历史跟踪服务。
  • 该平台不仅满足 2.38 亿活跃会员的需求,还关注前会员和重新加入会员的体验。
  • 该平台生成的数据将提供给下游消费者,以便他们了解注册情况和收入预测。

Netflix 选择使用 CockroachDB 和 Cassandra 很有意思。

CockroachDB 具有很强的一致性,适合处理计划定价信息等关键数据,而 Cassandra 则是一种高度可扩展的 NoSQL 数据库,适合处理大量会员数据。

此外,99.99% 的可用性也表明 Cassandra 非常注重弹性和容错性。无论如何,Netflix 以其全面的混乱工程实践而闻名,它可以主动测试系统的弹性。

注册流程

一旦用户开始 Netflix 之旅,他们就会遇到选择计划的选项。

由于货币、定价和可用计划存在地域差异,因此准确呈现计划选择页面至关重要。Netflix 的会员制平台可确保根据用户的位置和设备类型向其展示适当的选项。

下图显示了 Netflix 注册流程的详细步骤以及在流程中触发的服务:

1. 检索计划详情
2. 基于区域、设备类型的加载和读取计划
3. 展示选项
4. 会员选择了一个计划
5. 会员服务启动
5. 持续订阅信息
6. 写入历史服务
7. 通知计费
8. 生成发票
9. 发布事件
增长工程应用程序
会员计划目录
规则
SKUDB
选择计划页面
付款页面
会员状态服务
会员订阅服务
会员历史服务
计费工程应用程序
会员定价服务
事件
数据科学管道
消息管道

下面将详细介绍每个步骤:

  1. 首先,用户通过 Netflix 的增长工程应用程序选择计划。计划详情从会员计划目录服务中获取,该服务由 CockroachDB 支持。
  2. 会员计划目录服务根据预定义的地区和设备类型规则加载和读取计划。
  3. 然后将检索到的计划展示给用户,让他们根据自己的偏好和预算做出明智的决定。
  4. 用户选择计划后,流程会进入付款确认屏幕。在这里,用户提供付款详情并确认订阅。
  5. 确认后,用户点击 Start Membership 按钮,触发会员状态服务。该服务会将相关信息(如所选计划、价格层级和国家)保存到 Cassandra 数据库中。
  6. 会员状态服务还会将付款情况通知计费工程应用程序。
  7. 计费工程应用程序根据从会员定价服务获取的注册数据生成发票。
  8. 会员数据会同时写入会员历史服务,以确保全面记录用户的订阅历史。
  9. 发布事件以提示激活会员资格。这些事件会触发信息管道,负责向用户发送欢迎邮件,并通知下游系统以进行分析。

如何跟踪会员历史?

在 Netflix 会员平台的早期阶段,会员历史和数据是通过应用程序级事件来跟踪的。

虽然这种方法在初期已经足够,但随着 Netflix 的扩张和会员数据复杂性的增加,显然需要一种更精细、更持久的数据跟踪解决方案。

为了满足这一需求,Netflix 开发了基于变更数据捕获 (CDC) 模式的强大解决方案。

作为参考,CDC 是一种设计模式,可直接捕获对数据库所做的更改,并将这些更改传播到下游系统进行进一步处理或分析。

下图显示了 CDC 流程的工作原理:

目标系统
交易
数据库
CDC进程
缓存
数据仓
交易日志
交易表
数据库
CDC 如何工作?

采用类似 CDC 的方法可确保对会员数据源所做的所有 delta 更改都记录在一个仅有附件的日志系统中,该日志系统由 Cassandra 数据库提供支持。

下图显示了 Netflix 会员平台的历史数据流:

1. 计费合作伙伴更新请求
2. 更新客户的账单合作伙伴
3. 为客户添加更新数据
4. 将数据插入会员历史表
5. 发出更新会员资格的事件
会员服务
会员订阅服务
Cassandra
会员历史服务
Cassandra
事件
新会员历史记录流程

让我们来看看这个过程的步骤:

  1. 假设有一个修改会员计费伙伴的更新请求。会员订阅服务接收到该请求。
  2. 会员订阅服务会处理该请求并更新 Cassandra 数据库中的相关信息。
  3. 除了更新主数据库外,用户的更新数据还会附加到会员历史服务中。该服务负责维护会员数据所有更改的历史记录。
  4. 会员历史服务将附加数据插入会员历史表。该表是历史数据的持久存储。
  5. 最后会发出一个事件,通知下游系统有关成员资格更新的信息。这样,其他服务和流程就能对变化做出反应,并执行任何必要的操作。

这种设计有多种好处:

  • 详细调试:通过维护会员数据更改的全面历史记录,系统可以进行详细的调试和故障排除。开发人员可以追溯事件发生的顺序,了解数据是如何演变的。
  • 事件回放和对账:日志系统的只附加特性允许重放事件。在数据损坏或不一致的情况下,系统可以通过从已知的良好状态重放事件来调节数据。
  • 客户服务分析:会员历史记录服务捕获的历史数据使客户服务分析变得简单。

Netflix 会员平台的技术足迹

Netflix 会员制平台的技术架构可大致分为两个主要领域:开发和运营/监控。

让我们来详细了解每个领域。

开发堆栈

Netflix 会员制平台的开发堆栈可以用以下要点来描述:

  • Netflix 的架构经过优化,可处理每秒高读取请求 (RPS),以支持其庞大的用户群。
  • 会员平台由超过 12 个微服务组成,这些微服务在 HTTP 层使用 gRPC 进行通信。通常情况下,该平台每秒可处理 300-400 万个请求。为了支持如此大的处理量,Netflix 采用了 gRPC 层的客户端缓存和整个记录的内存缓存等技术,以防止 CockroachDB 成为单点故障。
  • 会员平台使用的主要编程语言是带有 Spring Boot 的 Java。不过,在某些重写场景中,Netflix 正在逐步过渡到 Kotlin。
  • Kafka 在消息传递和与其他团队(如消息传递和下游分析)的接口方面发挥着关键作用。这确保了不同系统间的顺畅通信和数据流。
  • Netflix 利用 Spark 和 Flink 对其大数据执行离线对账任务。这些对账工作对于保持会员平台内各种记录系统(如订阅和会员历史数据库)之间的数据一致性和一致性至关重要。数据的准确性还延伸到外部系统,确保整个生态系统的状态一致。
  • 为确保在线系统的数据一致性,Netflix 采用了轻量级事务并使用 Cassandra 等数据库。这种方法保证了不同服务间数据的完整性和可靠性。

运行和监测

Netflix 非常重视可观察性和监控,以确保其会员平台的顺利运行:

  • 广泛的日志记录、仪表板和分布式跟踪机制可实现快速的错误检测和解决。在 Netflix 复杂的微服务环境中,这些工具对于发现和排除故障至关重要。
  • 设置了生产警报,以跟踪运营指标并保证最佳服务水平。
  • 利用运营数据来推动机器学习模型,从而增强异常检测并启用自动问题解决流程。所有这些都是为了努力为用户提供不间断的流媒体体验。
  • Netflix 利用 Kibana 和 Elasticsearch 等工具创建仪表板并分析日志数据。在错误率激增的情况下,这些仪表盘可让团队快速识别导致问题的特定端点,并采取纠正措施。

结论

总之,Netflix 的会员平台是公司成功的关键组成部分,使其能够管理用户订阅的整个生命周期。该平台已从一个简单、轻量级的库发展成为一个强大、可扩展的架构,每秒可处理数百万个请求。

需要记住的一些关键要点如下:

  • 会员平台负责管理用户注册、计划变更、续订和取消。
  • 它采用微服务架构,使用 CockroachDB 和 Cassandra 等数据库存储会员数据。
  • 该平台使用 CDC 捕获并存储会员数据的历史变化,用于调试、事件重放和分析。

参考文献