奈飞分布式计数器剖析:全球范围内可扩展、准确且实时的计数

摘要:奈飞(Netflix)的工程师最近发表了一篇深入研究其分布式计数器抽象(Distributed Counter Abstraction)的文章,这是一项可扩展的服务,旨在以低延迟跟踪全球用户交互、功能使用情况和业务性能指标。该系统基于奈飞(Netflix)的

奈飞(Netflix)的工程师最近发表了一篇深入研究其分布式计数器抽象(Distributed Counter Abstraction)的文章,这是一项可扩展的服务,旨在以低延迟跟踪全球用户交互、功能使用情况和业务性能指标。该系统基于奈飞(Netflix)的 TimeSeries Abstraction 构建,通过可配置的计数模式、弹性数据聚合和全球分布式架构来平衡性能、准确性和成本。

计数听起来可能很简单。然而,奈飞(Netflix)的工程师强调了其中隐藏的复杂性:

分布式计数是计算机科学中的一个具有挑战性的问题。[......] 在奈飞(Netflix),我们的计数用例包括跟踪数百万次用户交互,监控向用户展示特定功能或体验的频率,以及在 A/B 测试实验期间对数据的多个方面进行计数等。

在撰写本文时,该服务跨不同的 API 端点和数据集在全球范围内的处理接近 75K 计数请求 / 秒,同时为其所有端点提供了个位数的毫秒级延迟。

各种分布式计数器操作的延迟信息(来源)

一些计数用例要求“尽最大努力的计数”(best-effort counting),优先考虑低延迟和最低基础设施成本,而不是绝对的准确性。其他一些用例则要求“最终一致的计数”(eventually consistent counting),确保精确和持久的计数,尽管会略有延迟并增加了运营成本。高可用性、容错性以及对幂等重试的支持需要在准确性、性能和可扩展性之间取得平衡。

尽管尽最大努力的计数器采用了相对简单的基于 EVCache 的实现,但奈飞(Netflix)在 TimeSeries 抽象之上使用事件驱动的架构实现了最终一致性的计数器。

每个计数动作都会作为不可变事件记录在 TimeSeries 抽象中,并带有幂等性密钥,以确保持久性并支持幂等重试。后台汇总进程使用基于时间的窗口不断聚合这些事件,将中间计数存储在持久存储中。这种方法避免了数据丢失,并通过数据存储的多区域复制支持一致的全局聚合。

记录计数器事件的汇总进程(来源)

幂等性(Idempotency)在分布式系统中起着至关重要的作用。在网络环境中,失败、重试和重复请求很常见,幂等性可确保重复操作产生与单次执行相同的结果,从而允许客户端重试其请求。作者强调了在此类环境中为客户提供的第二个有用的策略是:

对冲(Hedging)是指如果原始请求在预期的时间内没有返回响应,则客户端向服务器发送相同的竞争请求。然后,客户端使用先完成的请求进行响应。这样做是为了将应用程序的尾部延迟保持在相对较低的水平。只有当突变是幂等的时,才能安全地做到这一点。

TimeSeries 抽象本身是一个可扩展的、高吞吐量的数据平台,它以毫秒级的延迟存储和查询时间事件数据。它将数据组织成时间序列记录,按时间对事件进行分区,并在定义的时间间隔内对其进行分组。每个事件都是不可变的、带有时间戳和唯一标识,从而实现了精确的记录保存并且能支持高效的时间范围查询。目前,在高峰时段,它每秒可处理全球所有数据集中的近 1500 万个事件。

奈飞(Netflix)TimeSeries 抽象的吞吐量(来源)

在 Cassandra 等持久性存储解决方案和 Elasticsearch 等索引存储解决方案的支持下,该抽象可确保全局可用性和可调的一致性。它的架构支持动态扩展、可配置的保留策略和自适应的查询优化,使其成为分布式计数器抽象等数据密集型服务的基础。

奈飞(Netflix)的工程师们现在正在试验一种精确全局计数器(Accurate Global Counter)。这种计数器类型通过将预聚合计数与最近事件的实时增量相结合来增强实时聚合。它不会等待后台汇总,而是通过扫描自上次聚合以来未处理的事件来动态计算最新的计数。虽然这会增加读取复杂性和资源使用率,但并行查询和动态批处理可以保持较低的延迟,从而为关键指标提供近乎实时的准确性。

实验性的精确全局计数器的顶层概述(来源)

来源:散文随风想一点号

相关推荐