数据流基础:概念、批流对比与事件驱动架构

大家好,我是你们这堂课的老朋友。

今天咱们聊聊数据流。说实话,这个词在风控圈都快被说烂了。但真正理解它的人,我觉得不多。我见过太多团队,把数据流简单理解成「消息队列 + 消费程序」,结果线上出了大问题才回头补课。

所以这一节,咱们把地基打牢。我会结合自己踩过的坑,把数据流的概念、批处理与流处理的区别,以及事件驱动架构的核心逻辑,掰开揉碎了讲清楚。

一、到底什么是数据流?

数据流,说白了就是「数据在时间轴上的连续运动」。它不是一张静态的表,而是一条河。河水一直在流,你永远无法两次踏入同一条河。

在风控场景里,数据流长什么样?我举个例子:

  • 用户点击「下单」按钮,产生一条事件
  • 这条事件被发送到 Kafka
  • 风控引擎消费它,做实时规则判断
  • 判断结果再流回业务系统

整个过程,数据从源头到终点,中间经过多个处理节点。每个节点都在「流」中工作。

核心要点:数据流强调「持续产生」和「实时处理」。它不是一次性的批量导入,而是源源不断的增量数据。

我个人习惯把数据流分为三个维度:

  1. 数据源流:从哪里来?比如埋点日志、数据库变更日志、第三方回调
  2. 传输流:怎么传?比如 Kafka、Pulsar、RabbitMQ
  3. 处理流:怎么算?比如 Flink、Spark Streaming、Storm

你想想看,这三个维度缺一个,你的数据流架构就不完整。

二、批处理 vs 流处理:不只是快慢问题

很多新人问我:「批处理和流处理,不就是快和慢的区别吗?」

嗯,这么说也对,但太表面了。我曾在项目中吃过亏——用批处理的思维去设计流处理系统,结果延迟是降下来了,但数据准确性一塌糊涂。

咱们直接看对比:

维度 批处理 流处理
数据范围 处理「过去」的完整数据集 处理「现在」的实时事件
延迟要求 分钟级到小时级 毫秒级到秒级
触发方式 定时调度(如每5分钟跑一次) 事件到达即触发
数据视图 全量快照 增量流
容错机制 重跑整个批次 基于状态快照 + 重放
典型场景 离线报表、历史数据回溯 实时风控、实时推荐

看到区别了吗?批处理是「回头看」,流处理是「向前看」。在风控领域,我们既要向前看(实时拦截),也要回头看(离线分析)。

我的经验:不要试图用流处理替代批处理。我见过有人把所有离线计算都搬到 Flink 上,结果状态越积越大,最后 OOM 了。正确的做法是:流处理做实时决策,批处理做深度分析。两者互补,不是替代。

三、事件驱动架构:风控系统的灵魂

事件驱动架构,英文叫 Event-Driven Architecture,简称 EDA。说白了,就是「一切皆事件」。

在传统架构里,系统之间通过 API 调用耦合在一起。A 调用 B,B 调用 C,一个环节挂了,整个链路就断了。而在事件驱动架构里,系统之间通过事件总线通信。A 产生一个事件,扔到总线上,谁关心谁订阅。

为什么会这样?因为风控场景太复杂了。一个用户行为可能触发十几个规则,每个规则又依赖不同的数据源。如果用同步调用,延迟根本扛不住。

我给大家画一张图,看看事件驱动架构在风控中的典型流程:

事件驱动风控架构流程图 事件源 用户行为/交易/登录 事件总线 Kafka / Pulsar 流处理引擎 Flink / Spark Streaming 决策 规则引擎 实时规则匹配 特征计算 滑动窗口聚合 模型推理 实时模型打分 状态存储 Redis / RocksDB

这张图展示了一个典型的事件驱动风控流程:

  • 事件源产生事件,发送到事件总线
  • 流处理引擎从总线消费事件,同时触发规则引擎、特征计算、模型推理
  • 所有处理结果汇总到决策模块,输出最终判断

注意:事件驱动架构虽然解耦,但也带来了新问题——事件顺序和幂等性。我曾经在一个项目中,因为 Kafka 分区内事件乱序,导致风控规则误判。后来我们引入了事件时间戳 + 水位线机制才解决。这个坑,后面章节我会详细讲。

四、流处理的核心挑战

聊完概念,咱们说说实战中会遇到哪些挑战。我总结了三个:

  1. 时间语义:事件时间 vs 处理时间。你用哪个?我建议在风控场景里,优先用事件时间。因为处理时间受系统负载影响,不稳定。
  2. 状态管理:流处理是有状态的。比如你要统计用户过去5分钟的下单次数,这个「次数」就是状态。状态怎么存?怎么恢复?这是个大课题。
  3. 容错与一致性:机器挂了怎么办?数据会不会丢?会不会重复计算?Flink 的 exactly-once 语义能解决一部分,但需要你正确配置。

一个小技巧:刚开始做流处理时,别追求完美的一致性。先做到 at-least-once,配合业务层的幂等去重,往往更实用。我早期一个项目就是被 exactly-once 的配置折腾了两个月,后来发现业务层去重更简单。

五、总结一下

这一节我们聊了三个核心点:

  • 数据流是「持续运动的数据」,不是静态表
  • 批处理和流处理各有适用场景,别混用
  • 事件驱动架构是风控系统的骨架,解耦但需要处理好顺序和状态

嗯,内容不少。但这些都是后面所有实战内容的基础。你把这些概念吃透了,后面讲 Flink 算子、状态后端、容错机制时,你会觉得顺理成章。


公众号:蓝海资料掘金营,微信deep3321