2. 流数据基础:流数据的概念、与批处理的区别、金融流数据的典型特征

好,咱们进入正题。这一节聊的是流数据的基础。说实话,很多做金融系统的朋友,一开始都容易把流数据和批处理搞混。我当年刚入行时也踩过这个坑——以为只要数据能跑起来就行,结果线上出了大问题。

流数据,说白了就是数据在产生的同时就被处理。它不是等数据攒够了再统一算,而是来一条处理一条。你想想看,股票行情每秒成千上万笔,等攒够了再算?黄花菜都凉了。

2.1 流数据的概念

流数据是一种无界数据。什么叫无界?就是数据一直在产生,没有终点。比如交易所的实时行情、用户点击日志、传感器数据,这些都是流数据。

它的核心特征有三个:

  • 持续到达:数据源源不断,不会停
  • 顺序重要:数据到达的顺序往往决定了业务逻辑
  • 不可重放:错过就错过了,除非你专门做了持久化

我个人习惯把流数据想象成一条传送带。零件(数据)一个接一个过来,工人(处理逻辑)在传送带旁边直接干活。你不能等传送带停了再干,因为传送带永远不会停。

2.2 流数据与批处理的区别

这个区别,我建议你从三个维度来理解:

维度 流处理 批处理
数据范围 无界,持续到达 有界,固定数据集
延迟要求 毫秒级到秒级 分钟级到小时级
处理模式 逐条或微批次 全量扫描
状态管理 需要维护中间状态 通常无状态或全局状态
容错方式 基于 checkpoint 或 replay 重新跑一遍即可

举个例子你就明白了。批处理就像期末考试阅卷——等所有卷子收齐了,统一批改。流处理呢,就像课堂提问——学生回答一个,老师点评一个。你说哪个更适合实时风控?显然是后者。

我在项目中遇到过这样一个场景:某支付系统原本用批处理做交易对账,每天凌晨跑一次。结果有一次白天出了个重复支付的问题,等到第二天才发现,用户都投诉到监管那里去了。后来改成流处理,每笔交易实时校验,问题秒级发现。

2.3 金融流数据的典型特征

金融领域的流数据,跟普通流数据不太一样。它有三大硬性要求:

2.3.1 高吞吐

金融系统的吞吐量,我见过最夸张的是某头部券商的核心交易系统,峰值每秒处理超过 50 万笔行情。你想想看,这相当于每秒要处理 50 万次数据到达、解析、校验、分发。一般的消息队列根本扛不住。

高吞吐带来的挑战是什么?背压。当生产者速度远大于消费者速度时,系统会崩溃。我曾经见过一个系统,因为行情暴涨,Kafka 消费者处理不过来,结果消息积压到磁盘爆满,整个集群挂了。

避坑指南: 我曾经在压测时发现,单纯增加消费者线程数并不能线性提升吞吐量。原因在于线程切换开销和锁竞争。后来改用无锁队列 + 批量消费,吞吐量提升了 3 倍。

2.3.2 低延迟

金融交易对延迟的要求,可以用「变态」来形容。交易所的行情从产生到送达交易员,延迟要求通常在 10 毫秒以内。高频交易更是追求微秒级。

低延迟意味着什么?

  • 不能做复杂的计算(比如机器学习推理)
  • 网络传输要优化(比如用 RDMA 替代 TCP)
  • 序列化要轻量(比如用 Protobuf 替代 JSON)

我建议你在设计流处理系统时,把延迟预算分配好。比如总延迟要求 10ms,那网络传输占 2ms,序列化占 1ms,业务逻辑占 5ms,剩下的 2ms 留给 GC 和调度。这样你才知道瓶颈在哪。

2.3.3 有序性

这个最容易被忽视,但也是最要命的。金融数据对顺序极其敏感。比如:

  • 先有「买入委托」,后有「成交回报」——顺序乱了,成交回报先到,系统会认为这是一笔非法交易
  • 先有「撤单指令」,后有「成交确认」——如果顺序颠倒,撤单还没生效,成交却先来了,系统会多出一笔持仓

为什么会这样?因为金融业务是状态驱动的。每个事件都会改变系统状态,而状态的变更必须严格按照时间顺序。一旦乱序,状态就乱了,账就算不清了。

核心要点: 金融流数据的有序性,不是「尽量保证」,而是「必须保证」。我在设计某银行交易流水系统时,专门引入了序列号机制——每条数据都带一个全局递增的序列号,消费者按序列号排序后再处理。虽然增加了 2ms 的延迟,但保证了绝对有序。

2.4 知识体系总览

下面这张图,是我自己总结的金融流数据知识体系。你可以把它当作本章的思维导图:

金融流数据 高吞吐 背压控制、批量消费 无锁队列、线程优化 低延迟 轻量序列化、RDMA 延迟预算分配 有序性 序列号机制 状态一致性保证 三者缺一不可,共同构成金融流数据的核心挑战

嗯,这张图把三个特征的关系说清楚了。高吞吐、低延迟、有序性,三者不是独立的,而是相互制约的。比如你为了保有序性,可能要多加一个排序步骤,延迟就上去了。你为了提吞吐,可能要用批量处理,但有序性又难保证了。

所以实际设计时,你得根据业务场景做取舍。比如:

  • 行情推送:高吞吐 + 低延迟优先,有序性可以适当放宽(丢几条行情影响不大)
  • 交易流水:有序性必须保证,延迟可以稍微牺牲一点
  • 风控系统:三者都要硬,但可以通过架构设计来平衡
我的经验: 刚开始做金融流系统时,别想着一步到位。先保证有序性,再优化延迟,最后压吞吐。顺序搞反了,后面全是坑。

好了,这一节就到这里。流数据的基础概念和金融特征,你心里应该有数了。下一节我们会深入聊一致性模型——那才是真正烧脑的地方。


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