17611538698
webmaster@21cto.com

Twitter如何改进4000亿事件的实时处理架构

架构 0 883 2024-07-15 06:16:22

图片


背景

 

Twitter的旧软件架构基于lambda架构,包括批处理层、速度层与服务层。


Twitter每日需实时处理高达4000亿的事件,并生成PB级的数据。这些数据主要来源于分布式数据库、Kafka以及Twitter事件总线等多种事件源。


背景与挑战


Twitter 实时处理 4000 亿个事件,每天产生 PB 级的数据。这些事件来自许多来源,包括不同的平台和系统:HadoopKafkaGoogle BigQuery、 Google Cloud StorageGoogle PubSub等。为了处理海量数据,Twitter 针对每种需求构建了内部工具:Scalding用于批处理,Heron用于流处理,TimeSeries AggregatoR框架用于批处理和流处理,Data Access Layer用于数据消费。


尽管该技术非常稳健,但数据增长仍然给基础设施带来压力;最明显的例子是互动和参与管道,它批量实时处理大规模数据。该管道收集和处理来自各种实时流以及服务器和客户端日志的数据,以提取具有多级聚合和指标维度的推文和用户交互数据。该管道的聚合数据是 Twitter 广告收入和许多数据产品服务的真相来源。因此,管道必须确保低延迟和高准确性。让我们看看 Twitter 如何处理这一任务。


以下部分,我们描述 Twitter 原始的交互和参与管道解决方案。


旧的架构


概述


图片

图片由作者制作,供参考


Twitter 最初的解决方案采用了 lambda 架构。它有两个独立的管道:批处理(提供批处理的精确视图)和实时流处理(提供在线数据的视图)。


这两个视图输出最终会融合在一起。Twitter 的架构如下:


  • Summingbird平台:该平台包括多个分布式引擎,如 Scalding、Heron,一个专用库,允许用户定义 MapReduce 逻辑并在这些引擎上执行。

  • TimeSeries AggregatoR:一个强大且可扩展的实时事件时间序列聚合框架。

  • 批处理:批处理管道的来源可以是 HDFS 中的日志、客户端事件或推文事件。有许多 Scalding 管道用于预处理原始数据,然后将其导入 Summingbird 平台。管道的结果将存储在曼哈顿分布式存储系统中。为了节省成本,Twitter 在一个数据中心部署批处理管道,并在其他两个数据中心复制数据。

  • 实时:实时管道的来源是 Kafka topic主题。数据将“流”到 Summingbird 平台内的 Heron,然后 Heron 的结果将存储在 Twitter Nighthawk 分布式缓存中。与批处理管道不同,实时管道部署在 3 个不同的数据中心。

  • 批处理和实时存储之上还包括查询服务。


挑战


由于实时数据规模大、吞吐量高,存在数据丢失和不准确的风险。如果处理速度赶不上事件流,Heron 拓扑(有向无环图表示数据处理的 Heron 流程)中就会出现背压。当系统处于背压状态一段时间后,Heron Bolts(可以想象为 Worker)可能会累积滞后,从而导致系统整体延迟过高。


此外,许多 Heron 流管理器可能会因背压而失败(流管理器管理拓扑组件之间的数据路由)。Twitter 的解决方案是重新启动 Heron 容器以启动流管理器。然而,重新启动肯定会导致事件丢失,从而降低管道的整体准确性。


以下部分描述了 Twitter 在认识到原有解决方案的局限性后提出的新解决方案。


新架构


概述


图片

图片由作者制作。参考


通过新方法,Twitter 使用 Kappa 架构简化了解决方案,仅使用一个实时管道。该架构将利用内部 Twitter 和 Google Cloud Platform 解决方案:

  • 内部部署:他们构建了预处理服务,将 Kafka 主题事件转换为 Google Pubsub 事件表示。

  • 在 Google Cloud 上:他们使用Pubsub进行事件提取,使用Dataflow作业进行重复数据删除和实时聚合,并使用BigTable作为输出接收器。

新架构的流程可以这样描述:

  • 步骤 1:它们从源 Kafka 主题使用数据,进行转换和字段重新映射,最后将结果发送到中间 Kafka 主题。

  • 第 2 步:事件处理器将中间 Kafka 主题中的数据转换为 Pubsub 表示,并使用 UUID(用于 Dataflow 中的重复数据删除)和一些与处理上下文相关的元信息装饰事件。

  • 步骤 3:事件处理器将事件发送到 Google Pubsub 主题。Twitter 几乎无限次重试此 PubSub 发布过程,以确保消息以至少一次的方式从数据中心传递到 Google Cloud。

  • 步骤 4:Google Dataflow 作业将处理来自 PubSub 的数据。Dataflow 工作器实时处理重复数据删除和聚合。

  • 步骤5:Dataflow 工作者将聚合结果写入BigTable。

    Dataflow 工作者将聚合结果写入 BigTable。


评估

Twitter 对新架构的实现与迭代

新方法的实现


  • 与旧架构的 10 秒至 10 分钟的延迟相比,延迟保持稳定在 ~10 秒。

  • 与旧架构的最大吞吐量约 100 MB/s 相比,实时管道的吞吐量最高可达到约 1GB/s。

  • 通过至少一次向 Google Pubsub 发布数据以及 Dataflow 的重复数据删除工作,确保几乎精确地进行一次处理。

  • 节省建设批量流水线的成本。

  • 实现更高的聚合精度。

  • 处理延迟事件的能力。

  • 重启时无事件丢失


他们如何监控重复百分比?


图片



Twitter 创建了两个独立的 Dataflow 管道:一个管道将原始数据从 Pubsub 直接路由到 BigQuery,另一个管道将去重后的事件计数导出到 BigQuery。


这样,Twitter 就可以监控重复事件的百分比以及去重后的百分比变化。


他们是如何比较旧批处理管道和新 Dataflow 管道中的重复数据并删除计数的?


图片



  • 除了写入 BigTable 之外,新的工作流程还将重复数据删除和聚合的数据导出到 BigQuery。

  • Twitter 还将旧的批量数据管道结果加载到 BigQuery 中。

  • 运行计划查询来比较重复计数。

  • 结果是,新流水线结果的 95% 以上与旧批处理流水线完全匹配。5% 的差异主要是因为原始批处理流水线丢弃了迟到事件,而新流水线可以有效捕获这些事件。


结语


通过迁移到新的 Kappa 架构,Twitter 在延迟和正确性方面比旧架构有了显著改善。


新架构不仅性能更好,而且简化了数据管道,只保留了流管道。


我们下篇博客再见。

作者:Mayank Sharma

编译:onehunnit

考:

[1] Lu Zhang 和 Chukwudiuto Malife,《Twitter 实时处理数十亿事件》(2021 年)

https://open.substack.com/

https://blog.x.com/engineering/en_us/topics/infrastructure/2021/processing-billions-of-events-in-real-time-at-twitter-

评论