第一章 流计算基础与金融场景概述

1.1 实时流计算到底是什么?

说实话,很多人一听到「流计算」就觉得很高大上。其实没那么玄乎。

流计算,说白了就是「数据一边来,一边算」。跟传统批处理不一样——批处理是先把数据存起来,等攒够了再统一算。流计算呢?数据到了就处理,毫秒级出结果。

我刚开始接触这个领域时,也犯过迷糊。记得有一次在银行做风控项目,业务方问我:「你们这个流计算,跟数据库的触发器有啥区别?」嗯,这个问题问得好。触发器是数据库内部的事件机制,而流计算处理的是跨系统、跨数据源的实时数据流,场景完全不同。

实时流计算的核心特征,我总结为三点:

  • 低延迟:数据从产生到处理完成,通常在毫秒到秒级
  • 持续计算:数据流是无穷的,计算引擎需要7×24小时运行
  • 状态管理:很多计算需要记住历史数据,比如统计过去5分钟的成交笔数

核心要点:流计算不是简单的「数据来了就处理」,而是要在无穷数据流上做有状态的计算,同时保证结果的正确性。

1.2 金融场景的特殊性

金融场景对实时计算的要求,比互联网场景苛刻得多。为什么?因为钱的事,容不得半点马虎。

我个人在金融科技领域摸爬滚打了七八年,踩过的坑不少。金融场景的特点,我归纳为以下四个维度:

维度 要求 典型场景
延迟 毫秒级,通常<10ms 高频交易、实时风控
可用性 99.99%以上,全年停机<1小时 支付系统、行情推送
一致性 精确一次(Exactly-Once) 资金清算、对账
合规性 数据可审计、可回溯 监管报送、反洗钱

你想想看,一个支付系统如果因为流计算故障导致重复扣款,那后果有多严重?我曾经处理过一个线上事故,就是因为状态后端配置不当,导致交易流水重复处理,最后花了整整两天才把账调平。从那以后,我对一致性保证就格外敏感。

1.3 金融场景的典型架构

先看一张图,这是我画的一个典型金融实时计算架构:

数据源层 交易系统 行情源 用户行为日志 外部数据 消息中间件(Kafka / Pulsar) 数据缓冲、削峰填谷、解耦 流计算引擎(Flink / Spark Streaming) 实时ETL · 风控规则 · 指标计算 · 状态管理 输出层 数据库 告警系统 大屏展示 下游系统

这张图我画了很多遍,每次给新人培训都会拿出来讲。你看,数据从左边进来,经过消息中间件缓冲,再到流计算引擎处理,最后输出到各个下游系统。每一层都有可能出现故障,这也是我们这门课要重点讲的内容。

1.4 常见故障类型概览

做实时流计算,说白了就是跟各种故障打交道。我根据过往经验,把金融场景下的常见故障分成了五类:

  1. 数据倾斜:某个分区的数据量特别大,导致其他节点闲着,这个节点累死。我在一个行情处理项目中遇到过,某只热门股票的交易量是其他股票的100倍,结果那个节点直接OOM了。
  2. 状态不一致:Checkpoint失败或者恢复时状态错乱,导致计算结果出错。嗯,这个坑我踩过不止一次。
  3. 背压问题:数据生产速度大于消费速度,导致整个链路阻塞。说白了就是「吃不下」了。
  4. 延迟抖动:偶尔的GC停顿或者网络波动,导致处理延迟突然飙升。高频交易场景下,延迟从5ms跳到50ms,可能就是几百万的损失。
  5. 数据丢失或重复:Exactly-Once语义没配置好,导致数据要么丢了要么重复处理了。

⚠️ 特别注意:金融场景下,数据一致性问题是最高优先级的故障。宁可延迟高一点,也不能算错账。我曾经见过一个团队为了追求低延迟,把Checkpoint间隔设得太长,结果节点挂了之后恢复时丢了一大段数据,最后对账对了一周。

1.5 故障排查的思维框架

遇到故障不要慌,先问自己三个问题:

  • 现象是什么?——延迟高了?数据丢了?还是结果不对?
  • 影响范围多大?——单个任务?整个集群?还是所有业务?
  • 根因可能在哪?——代码逻辑?配置参数?还是基础设施?

我个人习惯用「分层排查法」:先看监控告警,再看日志,然后看指标,最后才看代码。很多新手一上来就翻代码,其实效率很低。你想想看,如果是因为Kafka集群挂了导致数据进不来,你翻Flink代码有什么用?

💡 小技巧:建议在项目初期就把监控体系搭好。至少要有:任务延迟监控、数据流量监控、Checkpoint状态监控、GC监控。这些监控在故障排查时能帮你节省大量时间。

1.6 本章小结

这一章我们聊了流计算的基本概念,金融场景的特殊要求,以及常见的故障类型。说白了,金融实时计算就是一场「既要又要还要」的游戏——既要低延迟,又要高可用,还要数据一致性。这三者之间本身就存在矛盾,需要我们在架构设计和参数调优时做权衡。

后面的章节,我会结合具体的故障案例,一步步带你走完排查过程。有些案例是我自己踩过的坑,有些是帮客户排查的线上事故。希望能让你少走一些弯路。


专注资料整理