数据工程设计模式——实时摄取与处理

引言(Introduction)

本章将深入解析实时(real-time)模式,并让读者熟悉如何用该模式构建解决方案。内容涵盖实时模式可解决的用例;同时讨论如何使用开源技术设计实时系统,并通过示例应用与代码片段加以演示。此外,还将介绍实时模式在真实场景中的应用实例。

结构(Structure)

本章涵盖以下主题:

  • 实时系统的用例
  • 实时系统的设计
  • 实时系统的技术选型
  • 真实案例

目标(Objectives)

在本章结束时,你将对实时模式有深入理解;你也能够基于实时模式设计并构建数据管道,并编写代码实现该设计。你将了解应选择的技术栈,以及如何将各组件"缝合"起来,搭建端到端的管道。最后,你还将理解哪些真实业务场景适合采用该模式,并看到来自支付电商行业的示例。

实时系统的用例(Use cases for real-time systems)

实时模式适用于多种场景:从构建实时分析 数据管道到机器学习实时打分(ML scoring) 。与批处理系统不同,实时系统在数据到达时持续处理 ,实现低延迟的处理与即时洞察/动作;而批处理系统在预定时间窗口内成批处理大量数据,延迟更高,更适合历史分析与报表。以下是适合实时模式的一些用例。

实时分析的数据管道(Pipelines for real-time analytics)

实时分析系统在上游事务系统产生数据的当下 即刻摄取,并在数据生成后立刻进行分析。这类系统对需要事件一发生就采取行动 的场景至关重要,而不是等事件被攒成批次后再处理。典型领域包括欺诈检测、物流、库存管理等。

以欺诈检测为例:关键在于发生时就阻断 欺诈,因此用于识别欺诈的数据必须实时可用;依赖批处理等会引入延迟的方式不可行。

通常,实时系统的构建难度高于批处理系统:它需要能在实时中进行消息传递并提供投递保障 的技术。Apache Kafka 已被证明是构建实时数据管道的高性能、可靠的消息系统,并围绕其形成了丰富生态,为主流数据源与数据汇提供连接器。

考虑一个使用 Web 或移动应用点击流(clickstream)的实时分析系统。点击流记录用户的导航轨迹:浏览的页面、点击的按钮、注册行为、看到的广告等。对点击流进行实时分析可以识别用户在网站/应用中的行为,并据此在用户仍停留在页面时推送推荐或优惠,实现即时定向广告,从而显著提升转化率。

该系统的关键挑战在于:点击流需在生成时即可用于分析 以产出合适的推荐/优惠;并且一旦生成推荐/优惠,需实时回传 至应用侧展示给用户。Apache Kafka 可通过不同 topic 同时支持这类双向/双通道通信。

下图给出了利用 Kafka 处理点击流信息的系统架构(图 4.1):

图 4.1:基于 Kafka 的点击流分析(Clickstream analysis with Kafka)

高可用性的变更数据捕获(Change data capture for high availability)

关键任务型(mission-critical)应用的数据库需要始终可用 ,即使在自然灾害等可能导致机房中断的场景下亦然。为实现这种高可用性,需要将主库 的数据实时 传播到从库/备库 。备库通常部署在异地的数据中心。

主从间的数据变更传播有多种方式。一些数据库(如 Couchbase )在数据库内部原生支持从主库到备库的实时变更流 。即便数据库未内建该能力,也可结合**数据库事务日志(change/transaction logs)**与可靠的消息传递框架(如 Apache Kafka)来实现。

具体做法是:几乎所有数据库都会生成事务日志 ,以预定义格式记录数据库中的变更。这些日志可被读取并处理,用于将变更传播到备库。Kafka 提供了可读取这些事务日志并将其推送为消息到 Kafka 的源连接器 ;随后由汇连接器 消费消息,并在目标数据库端将其转换为相应的 INSERT/UPDATE/DELETE 语句。一旦这些语句应用到目标备库,备库即可与主库保持同步。根据需求,备库可以与主库在同一区域(仅高可用)或异地区域(同时支持灾难恢复)。

下图展示了利用变更日志捕获构建数据库高可用的系统设计(图 4.2):

图 4.2:基于变更日志捕获的高可用架构(High availability using change log capture)

实时机器学习打分(Real-time ML scoring)

实时 ML 打分要求在极低延迟 下生成预测分数,以便系统能据此立即采取行动 ,从而预防 问题发生。相较于事后检测,实时打分能在问题扩大前阻断或缓解,因而已广泛应用于多个行业,如:工厂设备故障预警、支付与银行欺诈识别、库存缺货预测、网络安全攻击预警等。

网络安全 为例:任何系统行为都可通过一组参数来度量;在正常运行时,这些参数处于可接受范围(即遥测数据,telemetry )。在网络攻击期间,许多参数会出现异常偏移。用这些遥测数据作为特征训练的 ML 模型,在持续输入 当前遥测数据进行打分时,能够预测/识别异常。例如,系统在一定时间窗口内的网络活动与内存使用具有特定模式;模型可用长期收集的数据训练,然后用当前值进行异常分数推断。

构建这类实时异常检测框架分两步:

  1. 模型训练数据收集 :从各源系统收集遥测信息(如 SAR 指标、操作系统日志、网络日志 等),通过 Apache Kafka 等流式平台写入离线特征库 ;对原始数据进行特征工程,提取特征并训练模型。
    如下图所示(图 4.3):

图 4.3:基于遥测数据的模型训练(Model training on telemetry data)

  1. 在线推理与告警 :将训练好的模型部署到推理服务 以进行低间隔打分;打分所需的特征从在线特征库 读取以确保低延迟;最后基于打分结果触发潜在网络攻击的告警与处置。
    如下图所示(图 4.4):

图 4.4:基于遥测数据的在线推理(Online inferencing on telemetry data)

设计实时系统(Designing a real-time system)

本节我们设计一个实时分析系统 :从基于文档的 NoSQL 事务系统摄取数据,导入到分析系统中,并由分析系统驱动实时看板 。相较于在关系型数据上做实时分析,在文档型 NoSQL 上做实时分析会面临更多挑战,这些挑战因文档数据模型的无模式(schema-less)特性而加剧。为在文档数据模型上构建实时系统,我们需要能够对文档数据执行分析的专用技术 。在本示例中,我们使用 MongoDB 作为事务系统,使用 Couchbase 作为实时分析的分析系统。

要在 JSON 文档数据上实现实时分析,我们需要具备以下能力的系统:

  • 列式存储(Columnar storage) :查询时只读取所选列,避免扫描所有列,加速检索。列式存储是各类分析系统的首选,可显著降低 I/O 开销。市面上主流分析系统(从 Oracle Exadata、AWS Redshift 到 Snowflake)均采用列式存储。
  • 大规模并行处理(MPP) :将单条查询并行分发到多台服务器执行,缩短查询耗时,从而逼近实时分析。在无明显 I/O 等瓶颈时,MPP 通过横向扩展计算资源可获得近线性扩展性。
  • 基于 SSD 的缓存存储:SSD 缓存提供更快的数据访问,进一步降低查询时延。相较于机械盘,SSD 具备数量级更高的 IOPS 与更低的延迟。
  • 智能基于成本的查询优化器(CBO) :将次优的用户查询自动重写为高效的执行计划。优化器基于复杂代价模型在多个候选计划中挑选最优方案,减少人工调优,即便是机器生成的次优 SQL 也能转化为高效计划。
  • 模式灵活性(Schema flexibility) :MongoDB 存储 JSON 文档,模式灵活,文档间模式可变,且可包含嵌套文档与数组。将 JSON 建模为"行列式"的关系表既复杂又难以实时完成。要对 MongoDB 中的数据做分析,分析系统本身也需要具备无模式能力。

实现方案步骤如下:

  1. 创建 Apache Kafka 集群,并在集群中创建 topic,用于承载从 MongoDB 迁移到 Couchbase 的数据。
  2. MongoDB 上启用 副本集(replica set) ,以便执行变更数据捕获(CDC)并将变更推送到 Kafka。
  3. 部署 MongoDB Source Kafka Connector,把 MongoDB 的数据写入 Kafka topic。
  4. Couchbase 集群中创建 Kafka link,配置 Kafka 集群与 topic 信息。
  5. 连接该 Kafka link,启动从 MongoDB 到 Couchbase 的数据传输。

下图展示了一个利用 CouchbaseApache Kafka 对 JSON 数据进行实时分析的数据系统架构(图 4.5):

图 4.5:基于 Couchbase 的实时 JSON 分析(Real-time JSON analysis with Couchbase)

实时系统的技术选型(Technologies for real-time systems)

如本章所示,实时系统有两个关键特征:

  1. 以流式方式(而非成批)实时处理数据;
  2. 为处理提供极低延迟 的数据访问。
    要实现上述目标,需要两大技术栈:流式处理数据存储/服务层

高吞吐、低延迟 的流式场景中,消息/流处理技术如 Apache KafkaApache FlinkSpark Structured Streaming 非常流行。其中 Kafka 因其对各类源与汇系统提供丰富连接器而最为常用;Kafka 提供**至少一次(at-least-once)**投递语义,在很大程度上简化了实时应用的开发。

表 4.1 概述了 Apache Kafka、Apache Flink 与 Spark Structured Streaming 的最适配用例。

实时系统在存储与服务 层通常选用能提供高吞吐、低时延 访问的数据库。诸如 Redis、Couchbase、Aerospike 在实时系统中颇为常见,因为它们可为处理提供极快的数据访问。

  • 若实时系统处理的数据量较小、可完全驻留主内存,则可优先考虑 Redis 这类内存型缓存数据库。
  • 若数据规模更大,需要既能从主内存快速服务、又需持久化到二级存储 ,则更适合选择 Couchbase 这类带集成缓存的持久化存储

参考下表:

表 4.1:技术与用例匹配

技术(Technology) 工作负载类型与用例(Workload type & use case)
Kafka 低毫秒级延迟;事件采集;消息传递;数据集成
Flink 低到中等毫秒级延迟;事件处理;实时事件分析
Spark Structured Streaming 高毫秒至秒级延迟;近实时数据管道;实时 ETL

真实世界示例(Real-world examples)

本节讨论信用卡支付反欺诈游戏行业 中的若干真实案例,展示实时模式如何帮助数据系统在事件发生当下采取行动,而非延后处理。对这两类系统而言,能够在事件触发时即刻响应至关重要。本节同样说明:我们日常交互的系统中,实时模式早已深度嵌入其中。

支付反欺诈(Payment fraud detection)

在任何数字支付系统中,防范欺诈对保护消费者免受财务损失至关重要。欺诈必须在发生时即被识别并阻断,而不是事后再处理。实时系统在支付反欺诈中发挥关键作用:交易在进行中就需要被实时评估,同时又不能让用户感知到支付延迟。

反欺诈通常借助 ML 模型 完成:模型会对入站交易进行风险打分。若分数较高,交易将被拦截或触发与用户确认的工作流;若分数较低,则允许交易完成。

为了在实时 中完成打分,系统需按如下流程运作:用户发起交易后,支付网关处理请求,并通过 Kafka 等消息总线将交易详情发送至 ML 平台 进行打分。在 ML 平台中,首先从在线特征库(online feature store)提取与该交易相关的特征。在线特征库是一种具有极低延迟 服务能力的数据存储,持有模型打分所需的全部特征,使特征可即时用于推断。可选工具包括 TectonFeast。特征示例:用户常住地、用户平均交易金额、交易频率等。基于这些特征,ML 模型为交易生成欺诈分数。

下图展示了该反欺诈系统的组件(图 4.6):

图 4.6:实时反欺诈(Fraud detection in real-time)

游戏(Gaming)

实时系统在游戏行业被广泛使用,以支撑多种场景。无延迟的丰富交互体验是优质游戏(如 PUBG、Fortnite)的基石。为达此目标,游戏行业高度依赖实时系统。

以下列举实时系统在游戏中的应用示例:

  • 多人联机 :需要快速同步各玩家的操作,确保互动体验。一名玩家的行为(如选定武器、射击)必须实时 对其他玩家可见。任何反映延迟都会破坏体验,影响游戏成败。为实现该实时体验,游戏会使用 Couchbase 等数据库以获得超低延迟的数据服务。
  • 个性化体验 :许多游戏会依据玩家的水平、偏好、行为与购买记录进行个性化定制。要在实时 中完成个性化,系统需实时采集并分析玩家偏好与行为。常见做法是使用 Apache FlinkKafka 进行实时数据流处理,并采用 Redis、Couchbase 等数据库作为存储与服务层。

下图展示了基于 Apache KafkaCouchbase/Redis 缓存构建的实时游戏系统架构(图 4.7):

图 4.7:实时游戏系统(Real-time gaming system)

结语(Conclusion)

本章介绍了实时系统的一些常见用例,并设计了一个将 MongoDB 中的 NoSQL 事务数据迁移到类似 Couchbase Columnar 的分析型 NoSQL 系统的实时 方案;我们看到该设计如何借助 Apache Kafka 落地实现。同时,我们讨论了银行与零售媒体领域的实时系统示例,理解了这些案例的高层架构;并回顾了实时系统常用的技术栈及其应用。

下一章将讲解**批处理(batching)设计模式,并回顾各领域中采用微批(micro-batching)**的系统用例与真实案例。

相关推荐
stark张宇4 小时前
告别Git恐惧症!一套课程搞定Win/Mac/Linux三端配置与核心原理
git·架构·github
radient4 小时前
初识Agent、Prompt、Function Coding、MCP
后端·程序员·架构
jh_cao4 小时前
(3)SwiftUI 的状态之上:数据流与架构(MVVM in SwiftUI)
ios·架构·swiftui
文火冰糖的硅基工坊5 小时前
《投资-93》价值投资者的认知升级与交易规则重构 - 衡量公司价值的本质是在公司的整个存续期间能够创造多少自由现金流,而不是当下有多少现金流。
重构·架构·产业链
Hello.Reader5 小时前
Flink 内置 Watermark 生成器单调递增与有界乱序怎么选?
大数据·flink
工作中的程序员5 小时前
flink UTDF函数
大数据·flink
Asort5 小时前
JavaScript设计模式(七)——桥接模式:解耦抽象与实现的优雅之道
前端·javascript·设计模式
工作中的程序员5 小时前
flink keyby使用与总结 基础片段梳理
大数据·flink