惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

P
Proofpoint News Feed
S
SegmentFault 最新的问题
The Last Watchdog
The Last Watchdog
人人都是产品经理
人人都是产品经理
C
Check Point Blog
O
OpenAI News
V
Visual Studio Blog
S
Security @ Cisco Blogs
I
InfoQ
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
T
Troy Hunt's Blog
S
Secure Thoughts
大猫的无限游戏
大猫的无限游戏
Attack and Defense Labs
Attack and Defense Labs
www.infosecurity-magazine.com
www.infosecurity-magazine.com
SecWiki News
SecWiki News
月光博客
月光博客
U
Unit 42
博客园 - Franky
V2EX - 技术
V2EX - 技术
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
腾讯CDC
量子位
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
N
News and Events Feed by Topic
Engineering at Meta
Engineering at Meta
PCI Perspectives
PCI Perspectives
Cisco Talos Blog
Cisco Talos Blog
Google DeepMind News
Google DeepMind News
博客园 - 司徒正美
T
Tailwind CSS Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
TaoSecurity Blog
TaoSecurity Blog
Project Zero
Project Zero
WordPress大学
WordPress大学
A
Arctic Wolf
H
Help Net Security
Blog — PlanetScale
Blog — PlanetScale
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
I
Intezer
雷峰网
雷峰网
Security Latest
Security Latest
N
News and Events Feed by Topic
AI
AI
V
Vulnerabilities – Threatpost
S
Schneier on Security
Vercel News
Vercel News
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC

博客园_首页

Plist 二进制格式 Milvus 和 PGVector,哪个更好? OpenClaw 已过时?在 VS Code 中运行 Hermes Agent! 第30篇文章:一个大三计科生的自白 Manim如何在数学公式中完美显示中文? Docker 部署 RocketMQ 5 并发编程核心概念辨析 C#事务处理最佳实践:别再让“主表存了、明细丢了”的破事发生 CLI 是什么?为什么大厂突然集体卷命令行? 【从0到1构建一个ClaudeAgent】协作-自主Agent UIImageView 设置图片不生效的原因排查 最小二乘问题详解20:无先验约束下的增量式SFM自由网平差 痞子衡嵌入式:大话双核i.MXRT1180之XIP应用里借助MU实现可靠Flash IAP的方法 AI Chat 封装, SemanticKerne.AiProvider.Unified 已发布 Windows下右键编辑js文件无法打开记事本——在注册表中使用环境变量 在后台服务中使用 Scoped 服务,为什么总是报错? H200 安装驱动并使用sglang启动模型 wireshark 抓包Trap上报告警内容 我用 AI 辅助开发了一系列小工具(2):图片压缩工具 [A Primer On MC and CC] 2.1 Memory Consistency 1 - 指令重排序和 SC 模型 Oracle数据库SCN推进技术详解与实践指南 玩转控件:封装个带图片的Label控件 Claude Code 4.7 真正该升级的不是模型,而是你的工作流 前端小白一句话,AI 帮我做了个颜值拉满的桌面媒体播放器。当代码不再是门槛,一句话编程就是现实。 5. WorkBuddy: 小龙虾的灵魂三件套,让你的小龙虾不只是工具 SQLite 分片方案实战:三种分片策略的深度对比 告别简陋 UI!一款基于 Fluent Design 和基于 WinUI 的开源免费、现代化的 Avalonia UI 控件库 关于二进制排列组合枚举的总结 AI开发-python-LangGraph框架(3-27-LangGraph从零实现大模型智能决策工作流) ElasticSearch主分片和副本分片概念详解 【002】HTTPS 粗解:证书、TLS 握手与对后端配置的影响 Hermes Agent 一周暴涨五万 Star,但我劝你别急着追 明明连接的是Redis的DB0,为什么能查到DB3的数据? 【从0到1构建一个ClaudeAgent】协作-Agent团队 熟悉电子元器件之后,电子小白下一步该怎么走? MAF快速入门(23)通过C#类定义Skills .NET 高级开发 | 手写一个对象映射框架 FastAPI数据库ORM怎么选?我肝了三个Demo后,终于不再纠结了 mysqldump 参数拾遗:在遗忘与铭记之间 C# .NET 周刊|2026年3月5期 Claude code入门 - 陈彦斌 一文学习入门 ThingsBoard 开源物联网平台 GitHub 热门项目 | 2026年04月16日 如何为GIT设置全局勾子,为每次提交追加信息 Number.isFinite和isFinite与isNaN()和Number.isNaN的区别 PortSwigger SQL注入LAB2 推荐一个测试人必备的Skills,从功能到性能全搞定(附详细实操和安装下载方式) 筑基期:掌握Odoo基础核心知识点02(Odoo XML 开发方式详解) GLM模型这么火,咱们用vllm也咧一个呗! 深入理解 AbortController:从底层原理到跨语言设计哲学 字符串学习笔记 多租户系统框架的基础模块设计和分析设计 Apache SeaTunnel Zeta 为什么能做到“又快又稳”? AI开发-python-LangGraph框架(3-26-LangGraph基本概念及第一个简单样例) Vue 3 组件通信,别只会用 Props 和 Emits 了,这几个狠活儿你得看看 ElasticSearch7.X版本配置密码 用Manim实现动态交点计算--从一个动点问题说起 团结引擎+Addressable+Instant Game打包抖音小游戏 function call 实战:让 LLM 自动判断 pod 异常、调用日志工具并完成故障分析 bubseek —— 让 Agent 的足迹,变成团队的洞察 通过 C# 读取并导出 PDF 书签 如何用 GitHub Actions 实现 Steam 自动化发布 【从0到1构建一个ClaudeAgent】并发-后台任务 .NET 高级开发 | 定制 ASP.NET Core 框架 电子小白:什么是运算放大器(运放) zero2Agent:面向大厂面试的 Agent 工程教程,从概念到生产的完整学习路线 堆上的ORW HC32F460 USB CDC通信异常:非对齐访问异常排查 20260413-Hyperbridge 攻击事件:发生在默克尔山上的验证绕过 那些喊着AI 要淘汰你的人,正在靠你的焦虑赚大钱! 深度学习进阶(八)Swin Transformer 最小二乘问题详解19:带先验约束的增量式SFM优化与实现 SnapTranslate 3.0 正式发布:全局划词翻译 + 完整英语学习闭环,一站式搞定查词、记词、复习 工作的意义、工作的困难认知再思考 .NET + AI 进阶实战:基于类的技能开发 - 打造可治理的 Agent 能力模块 【从0到1构建一个ClaudeAgent】规划与协调-技能 上周热点回顾(4.6-4.12) 电子小白的工具三件套:面包板、杜邦线、万能板 单表五亿数据的查询优化 | Mysql、StarRocks 2. WorkBuddy:从“我是谁”到“帮我干活” C# 如何减少代码运行时间:7 个实战技巧 基于HelixToolkit.SharpDX 渲染3D模型 - 笺上知微 从零开始的双臂具身VLA起源及现阶段发展综述 - SkyXZ 记对 xonsh shell 的使用, 脚本编写, 迁移及调优 - pluvium27 受够了Vibe Coding的失控?换个起点,让AI事半功倍 从开始配置漏洞环境到漏洞复现流程 - 難しい 关于10年工作经验的程序员对OpenClaw的实战经验分享以及看法 - 虚无境 Any metadata 的内存布局 C# .NET 周刊|2026年3月2期 - InCerry 我帮你测过了,测试圈排名第二的 Skill 依然很牛逼 Skill Discovery | 无监督技能发现的经典工作总结 - MoonOut 上下文工程是什么?过时了么?一文讲明白! - 一枫说码 开了 TUN 模式还是直连?90% 的人都踩过这个坑 AScript扩展多种脚本语言 - rockey627 AI 学习笔记:Agent 的记忆机制 你能被装进一个文件里吗?——7 万人把同事"蒸馏"成了 AI - 我没有三颗心脏 Claude Code 通关手册(七):给 AI 装上技能包——Skills 完全指南 - 暮色之狐 在浏览器中快速编辑代码:VSCode Web 集成实践 - Newbe36524 蒸馏自己 skill?基于 Deepseek 的蒸馏器,丐版蒸馏方式,简单便捷 - To_Carpe_Diem Spring AI Aliababa和AgentScope,哪个更好? - 苏三说技术
内存化在对账系统中的应用实践
无所事事O_o · 2026-04-28 · via 博客园_首页

内存化在对账系统中的应用实践

上篇讲了内存化系统的设计思路,这篇是一次真实落地的案例,聊聊对账怎么做内存化,以及它在吞吐量、成本和工程复杂度上带来了什么。


一、重新认识对账问题

很多系统里,对账就是:两张表、一条 JOIN、一个定时任务。

流水量小的时候没问题。但量上来之后,JOIN 越来越慢,跨周期的逻辑越来越绕,锁、事务、补偿代码层出不穷。

根子在哪?对账不是 CRUD,是一个持续推进的状态机。

它有几个特点:流水量大,但生命周期有限;同一条流水只能处理一次;顺序和确定性很关键。这几点加在一起,恰好是内存化最合适的场景。


二、传统方案为什么越做越重

1. MySQL:适合存档,不适合推进

MySQL 做结果存档没问题,但对账需要的是过程计算:

  • 性能被 IO 和索引卡住
  • 复杂事务引发锁竞争
  • 中间状态被迫拆成多张表
  • 对账进度从表结构里根本看不出来

流水到千万级,对账系统就变成了一堆 SQL 在和时间赛跑。


2. Flink:能用,但资源花在了别处

先说结论:Flink 做对账不是不行,是有点重。

Flink 的优势在于来源多、乱序严重、迟到数据多的场景。用 keyBy + state + watermark 处理乱序,确实优雅。

但对账的真正瓶颈往往不是"能不能算出来",而是吞吐够不够、成本能不能接受、复杂度能不能长期维护。

落地下来,Flink 的问题集中在三块:

  • State 落在 RocksDB 上,未匹配流水多的时候磁盘 IO 很高
  • Checkpoint 在状态大、变化频繁的对账场景下容易成为瓶颈
  • State 膨胀、反压这些运维问题比较常见

所以 Flink 做对账是能用,但单位资源能跑多少流水,比内存化差不少。


三、内存化对账的核心思想

先说一个常见误解:内存化不是"为了快,把数据库换成内存"。它改变的是状态管理方式。

内存就是状态机。 对账状态只在内存里,内存里有什么,系统当前就是什么状态。没有"内存一份、数据库又一份"的数据冗余。

单写入者,顺序执行。 同一个对账任务只有一个线程在写,所有变更按顺序发生。不需要锁,不需要事务,也不需要对"并发写同一条流水"做任何处理。

可重建,而不是不能丢。 内存数据可以丢,但丢了之后要能重新建出来。这是后面"对账文件当 WAL 用"能成立的前提。


四、对账文件就是 WAL

对账场景有个常被忽略的事实:对账文件本身就是天然的 WAL。

文件记录的是已经发生的事,顺序固定、可重放,不需要再设计额外的日志系统。

快照不是全量流水的备份,而是一个或多个对账周期结束后,内存里还没对平的那部分流水。

恢复流程:加载最近快照,然后从对账文件里继续往后推进。就这两步。


五、整体流程

对账流程分几个阶段:

数据获取。 来源可以是对账文件、数据库导出、FTP 或 HTTP 上传,具体形式不重要。核心是拿到某个对账周期(1 分钟、1 小时、1 天)内的数据截断。

预处理(可选)。 多文件合并、按业务时间排序、处理上游乱序。上游已经有序的话,这步直接跳过。

读取。 顺序读每个业务方的对账文件,生成流水唯一 ID,写入各自的内存队列。把外部数据稳定地变成内存事件。

对账。 从一个队列里取数据,去另一个队列里找匹配。对平了就从两个队列里都删掉,没对平就放回队列尾部等后续流水。

image

持久化。 每个周期结束后,把内存里还没对平的数据存成快照;单边账写入数据库;配置和周期相关数据用单独的表维护。

image

运行流程:

image


六、内存队列模型

队列怎么推进

读取线程往队列尾部写流水,对账线程从头部取流水去匹配。能对平的直接删,不能对平的放回尾部。循环往复,队列里的数据慢慢被消化掉。

内存里剩下的就是当前系统状态,也是快照的内容。重启后,从最新快照恢复内存,再从快照点之后的对账文件重新开始对账。


跨周期不是异常

不同系统生成的对账文件,同一条业务流水的时间戳可能不同,有时候会落到不同的对账周期里。

所以一个周期内没匹配上,不代表是异常。当前周期的未对平流水会留下来,下个周期继续尝试。连续多个周期都没对平,才判定为异常。这样可以避免因为周期边界问题产生大量误报。


有序是前提

队列模型能跑起来,两边的流水得大致有序。

严重乱序的话,大量数据长期无法匹配,队列消不掉,内存就会一直涨,最终把对账任务撑死。实际工程里要么在预处理阶段排序,要么对上游提顺序约束。


周期必须同步

对账任务和所有来源任务必须在同一个周期里。对账还在处理 9 月 15 日,某个来源任务已经在读 9 月 16 日的数据,状态就乱了。


七、吞吐量对比

对账系统通常不太在意单条延迟,更关心同样机器资源下一分钟能对多少流水。

方案 单机吞吐量量级 主要限制因素
MySQL 万级 / 分钟 IO、索引、锁
Flink 十万级 / 分钟 State、Checkpoint
内存化 百万级 / 分钟 内存容量与带宽

Flink 的绝对吞吐量不差,但资源花在了通用性和分布式能力上。内存化方案只解决对账这一件事,相同资源下算力更集中,吞吐通常高一个数量级,延迟分布也更稳定。


八、代价与边界

说说缺点。

状态全在内存里,风险也集中。设计阶段要克制,分区方式直接决定系统上限。

但对账场景顺序明确、状态可回收,这两点恰好是内存化最能发挥的地方。


九、最后

内存化对账没什么神秘的,是一个务实的工程选择。

数据乱序、周期错位、系统崩溃,这些都会发生。内存化的方式是通过顺序执行和可重放的输入,把复杂性限制在它该在的地方处理,而不是扩散到整个系统。

如果你的对账系统吞吐量撑不住、成本压不下来、逻辑越来越乱,内存化不一定是激进方案,可能只是换了个更直接的路。

推荐一下我的微信小程序 - “两步动态验证”

  • 有任何建议或需求可以直接联系我
  • 免费云端加密备份 :换机不丢失,安全又便捷
  • API快速集成 :提供开放API,实现自动化验证码获取
  • 多端共享:基于微信小程度,可同时在手机,PC端共同使用,一键复制
  • 扫描二维码试用,或微信小程序搜索“两步动态验证”

图片