事件溯源在 credit 系统里的应用 ## 一个常见需求
📅 2026/7/1 14:07:04
👁️ 次浏览
做一个用户钱包系统:用户充值、消费、退款。看起来简单,就是数据库一张表,每次操作UPDATE balance SET balance balance N。但实际做起来,会发现一堆问题:高频写导致主从延迟写热行(balance那一行)锁竞争审计困难(谁改的、改之前多少)退款时怎么记录(覆盖之前的扣款?)解决:事件溯源 (Event Sourcing)不存当前余额,只存流水。余额是从流水求和算出来的。// 事件(append-only,不可变){event_id:evt_a3f9b2c1,ts:2026-06-19T12:00:00Z,account_id:user_123,type:deduct,// topup / deduct / refund / expireamount:-1,request_id:req_xyz,reason:search_api_call}当前余额:defget_balance(account_id):eventsclickhouse.query(SELECT sum(amount) FROM events WHERE account_id %(id)s,{id:account_id})returnevents4 个好处1. 审计天然每笔 credit 变动都有完整来源(谁、什么时候、为什么、改多少)。要查上个月为什么扣了 100,grep 事件就行。2. 可重放任意时间点的余额都能算出来。要做上季度末余额对账,按时间点过滤事件求和。3. 无锁竞争append-only 写,没有先读后写的锁。新事件直接 insert。4. 易扩展加新事件类型不破坏旧数据(老事件还在)。比如后来加 “promo_bonus” 事件,旧的不动,新的按新逻辑算。4 个挑战1. 余额是 derived,不是 source of truth理论上事件丢失 → 余额不准。所以事件存储要:多副本(至少 3 份)不可变(immutable)定期 snapshot(每隔 1 小时把余额快照存起来,加速查询)2. 实时性每次查余额都要 sum 全部事件,慢。所以加一层缓存(Redis),缓存丢了从 ClickHouse 重建。3. 过期逻辑难“1 个月后过期这种逻辑,事件溯源下要算截止 X 时间前的余额”:SELECTsum(amount)FROMeventsWHEREaccount_id%(id)sANDts%(expire_ts)s慢,需要单独的 expire job。4. Schema 演进事件 schema 改了怎么办?老事件是旧 schema,新事件是新 schema。要做 schema 兼容:加字段:新字段 nullable,老事件没值删字段:忽略,parser 不读改字段类型:加 version 字段,parser 按 version 分流实现classCreditSystem:def__init__(self,clickhouse,redis):self.chclickhouse self.redisredisdefadd_event(self,account_id,event_type,amount,request_id,reason):# 1. 写事件(append-only)event{event_id:str(uuid.uuid4()),ts:datetime.utcnow().isoformat(),account_id:account_id,type:event_type,amount:amount,request_id:request_id,reason:reason,}self.ch.insert(events,event)# 2. 失效缓存(下次查时重算)self.redis.delete(fbalance:{account_id})returneventdefget_balance(self,account_id):# 1. 查缓存cachedself.redis.get(fbalance:{account_id})ifcachedisnotNone:returnfloat(cached)# 2. 缓存 miss,从事件流算resultself.ch.query(SELECT sum(amount) FROM events WHERE account_id %(id)s,{id:account_id})balanceresult[0][0]ifresultelse0# 3. 写回缓存(短 TTL,5 分钟)self.redis.setex(fbalance:{account_id},300,balance)returnbalance性能 trade-off操作直接 UPDATE事件溯源单笔扣款1ms5-10ms(写事件 失效缓存)查余额(缓存命中)1ms1ms(读 Redis)查余额(缓存未命中)1ms50-200ms(sum 全部事件)审计追溯难(数据已覆盖)简单(grep 事件)数据恢复难(无历史)简单(重放事件)高频写场景(每秒 200 写),事件溯源反而更快,因为没锁。什么时候用适合:需要完整审计(金融、积分、credit)业务有过去的概念(版本、回放、撤销)写多读少(查余额不频繁)数据可重建(就算丢失能从其他源补)不适合:简单 CRUD(直接 UPDATE 更省事)强实时余额(电商库存,几毫秒必须准)数据规模超大(SUM 慢,需要物化视图)我们怎么做做 SERP API 的 credit 系统用的就是事件溯源:ClickHouse 存事件,Redis 缓存余额。每天 200 万次扣款,响应延迟 P99 10ms(主要是写 ClickHouse)。Redis 命中率 95%,余额查询 1ms。偶尔有客户争议为什么扣了 100,我们 grep 事件流,5 分钟内给客户完整账目。小结事件溯源不是银弹架构,是特定场景的好架构:需要审计 历史 重建 → 用简单 CRUD 强实时 → 别用,直接 UPDATE判断标准:你的系统需要过去吗?需要就用事件溯源,不需要就别上。SerpBase 实践SerpBase credit 系统用事件溯源:事件存储:ClickHouse(每天 200 万事件)余额缓存:Redis(命中率 95%)缓存窗口:5 分钟过期逻辑:Starter Boost 1 个月,其他永不过期效果:P99 扣款延迟 10ms,客户审计查询 5 分钟内完成。*本文来自 SerpBase 工程团队。
libteec代码详细分析libteec.so是TEE(Trusted Execution Environment,可信执行环境)客户端API的核心实现,遵循GlobalPlatform(GP)TEE标准,主要用于Linux用户空间(REE,富执…
📅 2026/7/1 14:05:03
React 与 Next.js 工程化实战:从服务端渲染到流式交互的性能全链路优化一、首屏白屏与交互卡顿:现代 Web 应用的性能瓶颈溯源
现代 Web 应用的用户体验瓶颈集中在两个维度:首屏加载速度与交互响应延迟。传统 CSR(客户端渲染&#…
📅 2026/7/1 14:05:03
终极图片格式转换指南:3分钟掌握Save Image as Type扩展 【免费下载链接】Save-Image-as-Type Save Image as Type is an chrome extension which add Save as PNG / JPG / WebP to the context menu of image. 项目地址: https://gitcode.com/gh_mirrors/sa/Save…
📅 2026/7/1 14:05:03
更多请点击:
https://intelliparadigm.com
第一章:评测背景与方法论总览 现代云原生基础设施的复杂性日益增长,对可观测性工具链的评估亟需系统化、可复现的方法论支撑。本章聚焦于构建一套兼顾技术深度与工程落地性的评测框架,覆…
📅 2026/7/1 15:23:21
更多请点击:
https://intelliparadigm.com
第一章:揭秘GPT-4、Claude 3、Gemini 1.5与Qwen2-72B真实性能差距:基于37项基准测试的权威横向评测 为客观评估当前主流大语言模型的真实能力边界,我们构建了覆盖语言理解、推理、代码生…
📅 2026/7/1 15:23:21
1. 为什么精确计时在现代电子系统中如此重要精确计时是现代电子系统的生命线。从工业自动化设备到消费电子产品,再到医疗仪器和通信基础设施,几乎每个领域都需要可靠的时钟信号来同步操作。想象一下,如果心脏起搏器的计时出现哪怕微秒级的偏差…
📅 2026/7/1 15:23:21
引言不少合肥家长都遇到过类似的困扰:孩子明明智力正常,却上课总走神发呆,写作业磨蹭半小时写不完两行字,日常小动作不断根本坐不住,不少家长第一反应是孩子故意偷懒、管教不到位,张口就批评反而让亲子关系…
📅 2026/7/1 15:23:21
博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…
📅 2026/7/1 15:23:21
原生Android电视直播软件:让老旧设备重获新生的终极解决方案 【免费下载链接】mytv-android 使用Android原生开发的视频播放软件 项目地址: https://gitcode.com/gh_mirrors/my/mytv-android
你是否还在为老旧电视无法流畅观看直播节目而烦恼?是否…
📅 2026/7/1 15:21:20
目录
第一步:选对模板,省心一半
第二步:打开扫码点餐功能
开启功能按钮
桌台管理与桌码生成
第三步:个性化设计,打造品牌感
调整点餐页面
设置点餐规则 你还在让顾客站着排队点餐吗?2025年ÿ…
📅 2026/7/1 0:00:39
在业务中快速构建一个能理解私有文档、准确回答专业问题的智能助手,是很多开发团队面临的共同挑战。传统方案往往需要从零开始搭建复杂的 RAG(检索增强生成)系统,涉及文档解析、向量化、检索、大模型调用等多个环节,整…
📅 2026/7/1 0:00:39
FAE放射组学分析工具:医学影像特征探索的完整解决方案 【免费下载链接】FAE FeAture Explorer 项目地址: https://gitcode.com/gh_mirrors/fae/FAE
你是否曾经面对海量医学影像数据感到无从下手?想要从CT、MRI等影像中提取有价值的定量特征&#…
📅 2026/7/1 0:00:39
6个月前的2025年12月,Boris Cherny 公开宣布自己卸载了 IDE。一时间,Vibe Coding 成了全行业最热的话题。6个月后,当我们回过头来拉一份真实账本,发现事情远没有"一句话生成一个App"那么浪漫。本文从产品经理和研发两个…
📅 2026/6/30 10:04:37
引言:审计结束三个月了,审计员的权限还没关某城商行每年按照监管要求开展至少一次数据安全审计。审计期间,内审部门需要抽样检查各类业务数据——交易流水、客户信息、员工操作日志、权限配置记录。这些数据分布在不同系统中,审计…
📅 2026/6/30 6:54:54
目录
第一步:选对模板,省心一半
第二步:打开扫码点餐功能
开启功能按钮
桌台管理与桌码生成
第三步:个性化设计,打造品牌感
调整点餐页面
设置点餐规则 你还在让顾客站着排队点餐吗?2025年ÿ…
📅 2026/7/1 0:00:39
在业务中快速构建一个能理解私有文档、准确回答专业问题的智能助手,是很多开发团队面临的共同挑战。传统方案往往需要从零开始搭建复杂的 RAG(检索增强生成)系统,涉及文档解析、向量化、检索、大模型调用等多个环节,整…
📅 2026/7/1 0:00:39
FAE放射组学分析工具:医学影像特征探索的完整解决方案 【免费下载链接】FAE FeAture Explorer 项目地址: https://gitcode.com/gh_mirrors/fae/FAE
你是否曾经面对海量医学影像数据感到无从下手?想要从CT、MRI等影像中提取有价值的定量特征&#…
📅 2026/7/1 0:00:39