3. 实时计算引擎:流处理框架选型

做风控系统,最头疼的是什么?

不是规则怎么写,也不是模型怎么调。而是——数据来了,你能不能接得住、算得快、判得准

我见过太多团队,离线跑得飞起,一到实时就崩。数据延迟、状态丢失、结果对不上……说白了,就是流处理引擎没选对。

今天咱们就聊聊,实时计算引擎到底怎么选。Flink 和 Spark Streaming,哪个更适合风控场景?事件时间和处理时间到底怎么用?水位线又是个什么鬼?

3.1 流处理框架选型:Flink vs Spark Streaming

先说说我的个人习惯。做风控实时计算,我首选 Flink。为什么?

你想想看,风控场景最核心的需求是什么?低延迟、高吞吐、状态一致性。这三样,Flink 天生就占全了。

对比维度 Flink Spark Streaming
计算模型 真正的逐条流处理 微批次(Micro-batch)
延迟 毫秒级 秒级(通常 1-5 秒)
状态管理 原生支持,强一致性 依赖外部存储,较弱
事件时间支持 原生,完善 有限支持
容错机制 分布式快照(Chandy-Lamport) RDD 血缘 + Checkpoint
风控适用性 ★★★★★ ★★★☆☆

我在项目中遇到过一件事。有个团队用 Spark Streaming 做实时反欺诈,结果每次数据高峰,延迟就飙到 10 秒以上。风控规则要求 3 秒内出结果,根本扛不住。后来换成 Flink,延迟直接降到 200 毫秒以内。

嗯,这里要注意。不是说 Spark Streaming 不好。如果你的场景对延迟要求不高(比如 5 秒以内都能接受),而且团队 Spark 技术栈已经很成熟,那用 Spark Streaming 也没问题。但风控嘛,每一秒都是钱,我建议还是 Flink 更靠谱。

核心结论: 风控实时计算,Flink 是更优选择。低延迟、强状态、事件时间支持完善,这三条就够了。

3.2 事件时间 vs 处理时间

好,框架选完了。接下来要解决一个灵魂拷问:你到底该用哪个时间?

说白了,事件时间是「事情真正发生的时间」,处理时间是「数据到达系统的时间」。这两者,经常不一样。

举个例子。用户凌晨 1 点发起了一笔交易,但网络延迟,数据到 1 点 05 分才进入系统。这时候:

  • 事件时间 = 1:00(交易发生的时间)
  • 处理时间 = 1:05(数据到达的时间)

你想想看,如果按处理时间算,这笔交易会被归到 1:05 这个窗口。但风控规则是按事件时间来的——凌晨 1 点属于高风险时段,1 点 05 分可能就不是了。结果就是,规则判错了

避坑指南: 我曾经犯过这个错。刚开始做实时风控时,图省事直接用了处理时间。结果上线后,大量交易被误判。查了半天才发现,是时间窗口不对。从那以后,风控场景我全部改用事件时间。

所以,风控场景下,事件时间是必须的。处理时间只能用在一些辅助场景,比如监控系统健康度、计算数据到达延迟等。

3.3 水位线机制

说到事件时间,就绕不开水位线。很多人觉得水位线难懂,其实没那么复杂。

水位线,就是告诉系统:到这个时间点了,后面的数据别等了,开始计算吧。

为什么要这个机制?因为数据可能乱序。比如:

  • 交易 A:事件时间 1:00,1:02 到达
  • 交易 B:事件时间 1:01,1:00 到达(网络快,先到了)
  • 交易 C:事件时间 1:02,1:05 到达(网络慢,晚到了)

如果没有水位线,系统会一直等,永远算不出结果。水位线就是「截止时间」——到了这个点,系统认为该来的数据都来了,开始计算。

我的经验: 水位线设置多少合适?一般根据业务容忍度来。风控场景,我通常设 5-10 秒。太短容易丢数据,太长延迟太高。你可以先设 5 秒,上线后观察数据延迟分布,再微调。

Flink 里设置水位线很简单:

// 示例:设置水位线,允许 5 秒乱序
DataStream<Transaction> stream = env
    .addSource(kafkaConsumer)
    .assignTimestampsAndWatermarks(
        WatermarkStrategy.<Transaction>forBoundedOutOfOrderness(Duration.ofSeconds(5))
            .withTimestampAssigner((event, timestamp) -> event.getEventTime())
    );

这段代码什么意思?就是告诉 Flink:允许数据最多晚到 5 秒。超过 5 秒还没来的数据,对不起,不要了。

核心要点: 水位线是事件时间窗口的「关门信号」。设得太短,数据丢失;设得太长,延迟增加。风控场景建议 5-10 秒,根据实际数据延迟调整。

3.4 知识体系总览

说了这么多,咱们用一张图把核心逻辑串起来:

实时计算引擎核心逻辑 框架选型 Flink(推荐) Spark Streaming 时间概念 事件时间 (风控必选) 处理时间 (辅助场景) 水位线机制 允许乱序 (5-10秒) 窗口计算 (Tumbling/Sliding) 选型 → 时间选择 → 水位线设置 → 窗口计算 → 输出结果

这张图把整个逻辑串起来了。从上到下,就是你在做实时风控时必须走完的路径:

  1. 选框架:Flink 优先,Spark Streaming 备选
  2. 定时间:事件时间为主,处理时间为辅
  3. 设水位线:允许乱序,控制延迟
  4. 开窗口:按事件时间做聚合计算
一个小技巧: 刚开始做实时风控时,别急着上复杂规则。先用 Flink 把数据接进来,设好事件时间和水位线,跑一个简单的计数窗口。确认数据流通了、时间对了,再往上加规则。这样排查问题会快很多。

好了,关于实时计算引擎的核心内容就这些。记住一句话:风控场景,选 Flink、用事件时间、设好水位线。这三步走对了,后面就顺了。

专注资料整理