这几年,“实时”几乎成了数据项目的标配。实时订单、实时库存、实时风控、实时生产、实时经营驾驶舱……很多项目一上来就要求数据从T+1升级到分钟级甚至秒级。但真正做过实时项目的人会发现,把任务从每天跑一次改成每分钟跑一次,并不等于实时数据架构。
当数据开始持续产生以后,一系列问题都会出现:源数据库能不能承受持续抽取?数据突然暴增会不会把链路打满?一条订单修改三次,下游到底保留哪个状态?消息重复、乱序、迟到怎么办?任务中断以后从哪里继续?实时指标为什么经常和第二天的财务报表对不上?
所以,实时架构真正解决的不是单纯的“速度问题”,而是:怎样让持续变化的数据,在采集、传输、处理、存储和消费的全过程中,既足够快,又尽可能准确、稳定和可追溯。 下面从一条订单数据产生开始,把实时数据架构完整拆开。

一、先理解实时架构:实时不是越快越好,而是延迟可控
传统数据体系通常按照“批次”工作。例如每天凌晨,把ERP前一天产生的订单抽出来,经过ETL加工以后进入数仓,第二天早上再给BI使用。整个过程可以概括为:业务系统 → 批量抽取 → ETL → 数据仓库 → BI
这种架构并没有错。财务结账、月度经营分析、监管报送等场景,本身并不需要秒级数据。真正推动实时架构出现的,是业务对数据时效的要求发生了变化。
例如:支付完成以后,风控希望几秒内判断是否异常;生产设备温度超过阈值,希望立即预警;商品卖出以后,库存系统希望快速更新可售数量。这时候,数据处理逻辑就从 “定期处理一批数据”变成了“持续处理不断发生的事件” 。
一笔订单创建,是一个事件;订单付款,是一个事件;订单退款,同样是一个事件。于是实时链路逐渐变成:数据产生 → 实时采集 → 消息传输 → 流式计算 → 实时存储 → 分析与业务应用
这里首先要建立一个非常重要的概念:企业需要的不是绝对实时,而是符合业务要求的延迟。 设备安全预警可能要求秒级,库存分析可能要求分钟级,经营驾驶舱5分钟更新一次已经足够。
因此建设实时架构之前,最好先给不同场景定义一个“延迟预算”。如果业务只要求10分钟更新一次,却投入大量资源追求毫秒级,不仅成本会上升,架构复杂度也会明显增加。
项目真正做到几十个业务库、几百张表时,靠一条条写增量SQL很快就会失控:不仅源库被频繁扫描,新增一张表、修改一个字段,都可能带来新的维护工作。
这类大批量数据库实时接入,通常更需要一条持续运行的数据管道。实时管道可以通过CDC捕获源端增删改变化,并覆盖多表、整库级同步;链路发生异常后,也能从已有进度继续处理。

换句话说,采集层真正要解决的不是“把一次同步做快”,而是让大量业务表长期保持稳定的数据流入能力。实时架构的第一步,不是提高任务频率,而是改变数据获取方式。
二、采集层:不要反复扫描数据,而要捕获“变化”
实时架构的第一层,是数据采集。企业里的实时数据来源很多,但大致可以分成三类。
数据库变化
ERP、CRM、订单、库存等核心系统,大量数据都存放在MySQL、Oracle、SQL Server等关系型数据库中。最直接的方法,是每隔几十秒执行一次增量SQL:
更新时间 > 上一次同步时间
小规模场景可能能够运行,但随着数据量增长,会暴露三个问题。第一,持续查询业务库会增加源端压力。第二,如果事务提交存在延迟,仅依赖更新时间可能产生漏数或者重复。第三,DELETE往往比INSERT、UPDATE更难通过普通增量字段捕获。
因此实时同步中经常使用CDC,也就是Change Data Capture,变更数据捕获。它关注的不再是“现在表里有哪些数据”,而是:从上一次读取以后,数据库发生了哪些变化。
以数据库日志为例,一条记录新增、修改或者删除时,CDC将变化提取出来,再传递给下游。这样,数据处理单位就从“整张表”变成了“变化事件”。

消息与行为事件
并不是所有数据都需要先写进数据库。用户点击商品、支付成功、页面浏览、物流节点变化,本身就是事件。这类数据通常可以直接进入Kafka等消息系统,再被多个下游消费。
API、IoT和外部系统
第三方SaaS、开放平台、设备传感器等数据,则可能通过API、HTTP、MQTT等方式进入企业数据体系。因此实时采集并不存在一种万能方案。数据库变化适合CDC,业务事件适合消息流,外部平台适合API或消息接口。 真正应该统一的,不是接入协议,而是进入企业数据平台以后对数据的管理方式。
三、传输层:Kafka解决的不是“传得快”,而是上下游解耦
数据采集以后,为什么还要增加Kafka这一层?假设一笔订单创建以后,实时数仓、库存系统、推荐系统、风控系统和营销系统都需要这条数据。
如果订单系统分别调用五个下游,就会形成大量点对点连接。任何一个消费者发生故障,都可能影响整个链路。消息系统真正解决的是:让数据生产者和消费者分开运行。 订单系统只需要把订单事件写入Topic,下游系统根据需要独立消费。这样会带来三个重要能力。
解耦
上游不需要知道有多少系统正在使用这条数据。以后增加新的分析应用,也不需要重新改造订单系统。
削峰
假设平时每秒产生1000条订单,促销期间突然变成每秒10000条。如果数据库和计算引擎只能处理6000条,Kafka可以先暂存消息,让下游按照自己的能力持续消费。因此实时系统真正需要关注的不只是吞吐量,还要关注:生产速度和消费速度是否长期匹配。
重放
实时计算代码出现问题以后,如果消息仍然保留,就可以重新消费某个时间段的数据。这对于修复错误和恢复数据非常重要。但引入消息队列以后,也会产生新的问题。
例如,同一个订单先“创建”,后“支付”,如果两条消息进入不同分区,下游可能先收到支付、后收到创建。因此订单、账户、设备等强关联数据,通常还要考虑:同一业务对象是否应该按照同一个Key进入同一分区。
但企业的实时架构很少会一直保持“一个Kafka解决所有问题”。交易系统可能往Kafka写消息,生产设备走MQTT,外部平台通过Webhook推送,数据库本身又有CDC变化流。来源越来越多以后,真正麻烦的是这些事件流如何进入同一套数据链路。
到了这里,数据集成做的已经不是简单搬运,而是把分散的实时事件组织成可持续消费的数据流 。Kafka的核心价值不是多了一层中间件,而是把原本相互绑定的系统拆开。
四、计算层:实时计算最难的,其实不是计算,而是状态
数据进入消息队列以后,通常还不能直接用于分析。一条原始订单可能只有:订单号、商品ID、门店ID、数量、成交价。如果要计算实时毛利,还需要关联商品成本;如果要看区域销售,还要关联门店所属区域。
所以实时数据同样需要经历:清洗、转换、关联、聚合和指标计算。 但实时计算与普通ETL最大的区别在于:数据永远处于“不断到达”的状态。

例如计算“最近5分钟各门店销售额”。系统不能等所有数据到齐以后再算,因为这个数据流理论上永远不会结束。
于是必须引入窗口。常见的有:滚动窗口:每5分钟统计一次,不重叠。滑动窗口:每1分钟计算最近5分钟数据。
但窗口解决以后,还有一个更棘手的问题:迟到数据。订单10:01产生,因为网络抖动10:04才到达;另一笔10:02订单反而10:02就到了。
这时候必须区分:事件时间:业务真正发生的时间。处理时间:计算系统收到数据的时间。如果只按照处理时间统计,就可能把10:01的订单算进错误窗口。再进一步,还要考虑状态。
假设订单最初金额1000元,后来修改成800元,实时指标不能简单地再增加800元,否则最终会变成1800元。系统必须知道:这是一条更新,而不是一条全新的订单。 所以实时计算真正难的地方,是持续维护:窗口状态、聚合状态、关联状态和业务对象的最新状态。
实时链路做到后面,最容易出现的并不是“不会算”,而是同一条业务规则被写了很多遍。客户名称清洗一套、产品编码转换一套、敏感字段脱敏又一套;今天改了A任务,明天却忘了B任务,最后不同看板开始出现不同口径。
所以计算层往后一定会碰到治理问题。像数据管理能力,就可以把重复使用的清洗逻辑沉淀成全局规则,同时结合数据检测和血缘分析,检查数据质量,并追踪异常会影响哪些任务和下游对象。

实时越快,越需要把规则、质量和血缘管住,否则错误也会被更快地传下去。 因此,实时计算的核心不是“快算”,而是在数据持续变化时仍然保持计算逻辑正确。
五、存储与分析层:为什么实时数仓仍然离不开离线数据?
数据经过处理以后,最终还需要落到能够被业务消费的位置。这里经常出现一个误区:有了实时数仓,是不是传统离线数仓就没有用了?
实际上,两者通常长期共存。实时链路擅长解决:今天到现在发生了什么。 离线链路更擅长解决:完整历史最终应该是什么。
例如销售驾驶舱需要不断刷新当天销售额,实时链路最合适。但月底重新核算过去一个月收入时,可能需要重新处理退款、冲销、组织调整和成本变化。这时候,大规模历史重算仍然更适合批处理。

因此企业常见的架构会逐渐形成两条链路:实时链路:CDC/Kafka → 流式处理 → 实时分析库 ;离线链路:批量同步 → 数仓建模 → 历史汇总
最终在指标层或者分析层汇合。这背后其实是一个非常重要的架构原则:实时结果解决“现在看什么”,离线结果解决“最终怎么算准”。 甚至很多企业还会设计T+1校准机制:白天使用实时数据,第二天通过完整批量任务重新核对昨天结果。
如果实时销售额最终是1000万元,而第二天离线核算是998万元,系统还要进一步定位差异到底来自迟到数据、重复消费、退款处理还是口径变化。因此,实时链路上线以后,批量任务通常不会消失,反而会承担另一个角色:给实时结果兜底和校准。
白天的驾驶舱先根据实时数据不断刷新,夜间再把退款、冲销、迟到数据等完整算一遍,对当天结果重新核对。这个阶段用到的就不再是实时管道,而是把周期性同步、历史补数和结果核验串起来。
这样一来,两条链路的边界就很清楚:实时负责“先看到”,批量负责“最后算准”。 实时架构真正成熟的标志,不是所有数据都变成实时,而是实时和离线各自承担最合适的任务。
六、真正决定实时架构能不能上线的,是可靠性和治理
很多架构图画到“Kafka → 实时计算 → OLAP → BI”就结束了。但真正上线以后,最难的往往是图上没有画出来的部分。
延迟监控
任务显示“运行中”,并不代表数据真的实时。源端13:00产生的数据,如果13:20才到看板,技术上链路没有中断,业务上却已经失去实时价值。因此真正应该监控的是:端到端数据延迟。
消息积压
Kafka里最值得关注的指标之一就是消费Lag。如果消息生产速度长期大于消费速度,积压会越来越严重。系统看起来没有报错,但实时数据已经悄悄变成“十分钟前的数据”。
数据一致性
源端产生100万条变化,下游到底成功处理多少?因此实时体系同样需要对账:源端变化量、消息数量、消费数量、写入数量、异常数量。

幂等与重复数据
网络重试、任务恢复都可能导致同一条消息被处理多次。如果一次支付事件被重复计算两遍,所谓实时反而会更快地产生错误。因此下游需要根据业务主键、事件ID等机制保证:同一个业务事件重复到达,也不会重复产生结果。
Schema变化
今天业务系统增加字段,明天修改字段类型,后天把字段删除。这种Schema Evolution如果没有治理机制,很容易让实时任务突然中断。
所以实时数据架构最终一定会从“技术链路建设”走向:任务监控、质量校验、异常告警、元数据管理、血缘分析和变更管理。 否则企业得到的只是一条速度很快,却不知道什么时候会错的数据流水线。

结语
把整套架构重新串起来,其实就是六层:采集层解决数据怎么出来;传输层解决数据怎么稳定流动;计算层解决数据怎样实时加工;存储层解决结果放在哪里;分析层解决数据怎样产生业务价值;治理层保证整条链路长期可靠运行。
真正做实时数据架构时,最值得关注的也不是“有没有Kafka、Flink、CDC”,而是更底层的几个问题:什么业务真的需要实时?允许多大延迟?数据变化能不能被完整捕获?数据重复、乱序、迟到以后怎样保证结果正确?实时结果和最终离线结果能不能对得上?链路异常以后能不能快速发现、恢复和追溯?
所以,实时架构从来不是把所有数据都做成秒级,而是按照业务价值,为不同数据设计合理的时效、成本和可靠性。 能够做到这一点,企业建设的才不是一套“实时技术栈”,而是一套真正能够持续支撑业务运行的实时数据体系。