news 2026/1/14 4:06:22

低延迟流处理系统设计:别再迷信“又快又准”,工程从来都是妥协的艺术

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
低延迟流处理系统设计:别再迷信“又快又准”,工程从来都是妥协的艺术

低延迟流处理系统设计:别再迷信“又快又准”,工程从来都是妥协的艺术

大家好,我是Echo_Wish

做流处理这些年,我发现一个特别有意思、也特别“坑新人”的现象:
一提实时系统,大家张嘴就是——低延迟、高吞吐、强一致、零丢失。

听着是不是很爽?
但真干过的人都知道一句话:

这玩意儿,最多只能同时满足两到三个。

今天咱就不讲那些“教科书正确”,就聊一个工程里绕不开的话题:

低延迟流处理系统,本质就是在吞吐和准确性之间反复横跳。


一、先把话说明白:你追的“低延迟”,到底是啥?

很多人一说低延迟,其实自己都没想清楚。

我一般会先反问一句:

你说的延迟,是端到端延迟,还是计算延迟

常见三种“延迟”,别混了

  1. 事件时间延迟

    • 数据真实发生 → 系统处理完成
  2. 处理时间延迟

    • 数据进入系统 → 算完
  3. 可见性延迟

    • 算完 → 下游/用户能看到

很多系统“看起来很快”,其实只是处理时间快
事件时间慢得一塌糊涂

👉这是后面“准确性翻车”的根源。


二、吞吐 vs 准确性:你不选,它也会替你选

我们先说个大实话:

高吞吐,天然就对准确性不友好。

为什么?

1️⃣ 为了吞吐,你一定会做这些事

  • 批量处理(micro-batch)
  • 异步 IO
  • 缓冲 + 合并
  • 延迟 checkpoint
  • 放宽一致性

这些操作每一项都在赌一件事

“数据不会乱序 / 不会丢 / 不会晚到太多”

赌赢了,系统飞起
赌输了,数据对不上,老板找你


三、一个最真实的例子:窗口统计里的“慢数据”

假设我们做一个实时 PV 统计,5 秒一个窗口。

天真的写法(吞吐优先)

fromcollectionsimportdefaultdictimporttime window_size=5counts=defaultdict(int)window_start=int(time.time())defprocess(event):globalwindow_start now=int(time.time())ifnow-window_start>=window_size:print("window result:",dict(counts))counts.clear()window_start=now counts[event["page"]]+=1

这个代码:

  • ✅ 快
  • ✅ 简单
  • ❌ 准确性靠运气

问题在哪?

  • 网络抖一下,数据晚到
  • 上游 GC 一下,事件乱序
  • 某个节点慢了 1 秒

结果就是:

窗口已经算完了,数据才姗姗来迟


四、为了“准一点”,系统开始变复杂

于是你开始补救。

1️⃣ 引入事件时间 + watermark

defshould_close_window(event_time,watermark):returnevent_time<=watermark

你开始等:

  • 等慢数据
  • 等乱序
  • 等系统“确定不会再来了”

👉延迟就上来了

2️⃣ 加 allowed lateness

allowed_lateness=3# seconds
  • 多等 3 秒
  • 准确性 ↑
  • 延迟 ↑
  • 状态存储 ↑
  • 内存压力 ↑

这时候你已经站在十字路口了:

再准一点,还是再快一点?


五、工程真相:你必须“人为制造不准确”

这话可能刺耳,但我说得很负责任:

所有大规模低延迟系统,都是“可控的不准确”。

常见工程妥协手段

1️⃣ 近似计算(Approximation)
  • HyperLogLog
  • Bloom Filter
  • Count-Min Sketch
# 伪代码:近似去重uv_estimate=hll.add(user_id)

结果是:

  • 误差 0.5% ~ 1%
  • 延迟和内存直接降一个量级
2️⃣ 分级准确性
  • 实时结果:给看板用
  • 离线回算:给财务用

我见过太多公司:

实时报表 ≠ 对账结果
但 KPI 只盯实时的

3️⃣ 牺牲少量数据完整性
  • 超时就丢
  • 超出 watermark 就忽略
  • 单点异常直接跳过

工程上有句话很现实:

宁可算得不全,也不能一直不出结果


六、为什么我越来越不迷信“Exactly Once”

老实说,我现在看到“Exactly Once”,心里是警惕的。

不是它不好,而是:

  • 状态重
  • 协调复杂
  • 性能成本高
  • Debug 成本爆炸

很多业务其实只需要:

  • At Least Once + 幂等
  • 最终一致
defprocess(event):ifprocessed(event.id):returnhandle(event)mark_done(event.id)

这套方案:

  • 系统简单
  • 延迟低
  • 出问题也好修

👉比追求“绝对正确”更工程友好。


七、我自己的一个判断标准(送你)

如果你正在设计一个低延迟流系统,我建议你先问自己这 3 个问题:

  1. 这个数据,错 1% 会死人吗?
  2. 这个结果,是给人看,还是给系统算钱?
  3. 延迟 1 秒,和错 1 条数据,哪个更不能接受?

只要你老老实实回答完,
架构方案基本就出来了。


八、最后说点掏心窝子的

做流处理这么多年,我最大的感受是:

系统设计不是炫技,而是为业务兜底。

真正成熟的系统,不是参数全开、语义拉满,
而是:

  • 能跑
  • 跑得稳
  • 出问题兜得住

低延迟流处理,从来不是“我全都要”,
而是:

我知道自己放弃了什么,也知道为什么放弃。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/12 10:41:32

1.4 用数据挖掘的视角重新理解生成式AI

1.4 用数据挖掘的视角重新理解生成式AI:为什么GPT能"思考"? 引言 ChatGPT能写代码、回答问题、创作文章,看起来像在"思考"。但作为数据挖掘师,我们需要从更深层次理解:GPT的"思考"本质是什么?它和数据挖掘有什么关系?本文将从数据挖掘的…

作者头像 李华
网站建设 2026/1/12 4:01:42

1.8 金融行业数据决策全解析:8大核心场景从理论到实战

1.8 金融行业数据决策全解析:8大核心场景从理论到实战 引言 金融行业是数据驱动决策的典型代表。从风险控制到精准营销,从反欺诈到智能定价,数据挖掘在金融领域的应用无处不在。本文将深入解析金融行业的8大核心数据决策场景,带你从理论到实战,全面掌握金融数据挖掘。 …

作者头像 李华
网站建设 2026/1/11 16:19:14

1.19 OSM模型实战:目标-策略-指标,搭建可落地的数据指标体系

1.19 OSM模型实战:目标-策略-指标,搭建可落地的数据指标体系 引言 OSM模型(Objective-Strategy-Metric)是构建数据指标体系的有效方法。通过明确目标、制定策略、定义指标,可以搭建可落地的数据指标体系。本文将深入解析OSM模型,并通过实战案例,教你如何应用OSM模型构…

作者头像 李华
网站建设 2026/1/12 15:29:59

【毕业设计】基于人工智能迁移学习的睡意检测报警系统

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/1/12 1:23:28

Linux内核进程管理子系统有什么第九十一回 —— 进程调度(18)

接前一篇文章:Linux内核进程管理子系统有什么第九十回 —— 进程调度(17) 上一回讲解了Linux内核中调度类结构struct sched_class的定义及各成员的意义。本回开始,依次对于各个调度类(fair_sched_class、rt_sched_class、dl_sched_class、idle_sched_class和stop_sched_cl…

作者头像 李华
网站建设 2026/1/7 2:54:41

强烈安利9个AI论文平台,专科生毕业论文写作必备!

强烈安利9个AI论文平台&#xff0c;专科生毕业论文写作必备&#xff01; AI 工具让论文写作不再难 在当今这个信息爆炸的时代&#xff0c;专科生的毕业论文写作正面临着前所未有的挑战。从选题到撰写&#xff0c;再到查重和修改&#xff0c;每一步都可能成为压垮学生的最后一根…

作者头像 李华