Airbnb 创建 Riverbed:Lambda 风格的数据框架
Airbnb 开发了 Riverbed,一个类似于 Lambda 的数据框架,用于生成和管理分布式物化视图(Materialized Views)。该框架支持超过 50 个读密集型用例,数据来源于公司面向服务架构(SOA)平台中的多个数据源。Riverbed 使用 Apache Kafka 和 Apache Spark 分别处理在线和离线组件。
问题背景
Airbnb 发现,一些跨多个独立数据存储的复杂查询导致平台某些热门功能的延迟增加。由于计算物化视图所需的数据不位于单一数据库中,团队无法使用许多数据库提供的标准物化视图方法。
解决方案:分布式物化视图
团队考虑使用变更数据捕获(CDC)、流处理和专用数据库的组合来创建分布式物化视图。他们评估了两种实时数据处理架构:
- Lambda 架构:结合批处理和实时处理,能够高效处理大量数据。
- Kappa 架构:专注于流处理,虽然维护性更好,但在实现回填机制和确保数据一致性(特别是处理乱序事件)方面存在挑战。
Riverbed 框架采用了 Lambda 架构,并提供了声明式的方式来定义数据查询和计算逻辑,使用 GraphQL 处理在线(实时事件)和离线(数据回填)组件。该框架负责处理并发、版本控制和数据正确性保证,并与基础设施组件集成。
实时处理
在实时处理方面,Riverbed 使用 Apache Kafka 消费数据源发出的 CDC 事件。这些事件触发通过 GraphQL 定义的聚合逻辑来更新物化视图,并将生成的文档存储在物化视图数据库中。处理过程高度并行化和批量化,以提高效率。
为了避免竞态条件,CDC 事件在 Apache Kafka 中根据物化视图文档的标识符重新分区,确保物化视图的更新按顺序进行。此外,在线(实时)和离线(批处理)处理之间使用乐观并发控制,以避免并发写入和潜在的数据不一致。
批处理
Riverbed 支持数据回填和协调,以应对由于缺少 CDC 事件而导致的实时处理问题。这部分解决方案使用 Apache Spark 处理数据仓库中存储的每日快照数据。框架根据 Riverbed 中配置的 GraphQL 定义生成 Spark SQL。
成果
目前,Riverbed 每天处理 24 亿个事件,写入 3.5 亿个文档,支持 Airbnb 中支付、搜索、评论、行程和内部产品等功能的 50 多个物化视图。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。