数据与状态系统真正的难点不是逻辑Awesome Architecture第05章精讲【免费下载链接】awesome-architecture Architecture-first system design: 26 bilingual tutorials, 25 architecture templates, and 6 end-to-end cases covering distributed systems, AI-native systems, RAG, coding Agents, and production trade-offs.项目地址: https://gitcode.com/gh_mirrors/awesomearc/awesome-architecture在 Awesome Architecture架构图谱开源知识库中第05章「数据与状态」 给出了一个反直觉的核心论断逻辑好改数据难改。代码写错了改一行重新部署就行但当几亿条数据已经按某种结构躺在库里、用户状态正实时变动时你想改它——那是要命的。本章精讲带你用最少的篇幅吃透数据与状态管理中最关键的六个判断数据放哪、一致性选多强、事务怎么取舍、数据怎么扩、缓存怎么防坑、数据模型为什么最难改。先建立直觉状态既麻烦又值钱新人最容易把系统里所有东西混为一谈但架构师会先分两类类型特点扩容能力生活化比喻无状态给输入、算输出、算完就忘想复制多少就复制多少便利店收银员谁来都一样不够就加人有状态记得事且记忆随时间变化余额、购物车、在线会话复制就有同步问题图书馆里那本独一无二的孤本由此引出分布式系统的第一性原理之一无状态好扩有状态难扩。所以你会在几乎所有成熟架构里看到同一个动作把状态从计算里挤出去集中放进少数几个专门管状态的地方数据库、缓存让其余组件尽量无状态、随便复制。但状态不是只有坏处。用本章的原话状态是万恶之源——一致性难题、扩容难题、故障恢复难题根子都在它状态也是价值之源——用户数据、订单、关系、记忆正是产品的全部价值。架构师的功夫不是消灭状态而是把状态管理得明明白白放哪、多强的一致、怎么扩、故障时怎么不丢不乱。数据放哪为访问形态选存储新人最常见的误区是我会用某个数据库就拿它装一切——就像不管装什么都用同一种盒子。正确思路是先看数据长什么样、怎么被访问再选存储。这是本章最值得背的存储选型速查表存储类型最适合的场景一句话直觉关系型结构清晰、关系复杂、需事务和强一致用户、订单、账户、库存钱、账、关系的默认家文档型结构灵活、自包含、按 ID 整取整存文章、配置、会话记录一坨半结构化 JSON字段常变就用它键值 KV极简按 key 取值要求极快会话、计数、缓存一本超大字典要闪电读写列存海量数据上的分析聚合报表、年度销量统计扫一大片、算个总和或平均图重点在关系网络本身社交、推荐、风控关联查谁连着谁路径的专家向量按语义相似度检索RAG、推荐用的 embedding找意思最像的内容普通库做不到对象存储大块、不可变的大文件图片、视频、模型权重海量文件的仓库便宜、能装、不改搜索引擎全文检索 / 复杂条件过滤排序商品搜索、日志检索输入关键词模糊找出相关一堆时序带时间戳、只追加、按时间聚合监控指标、计费流水不断增长的时间轴擅长按时段算趋势⚠️ 记住两点复杂系统几乎一定同时用好几种存储。这不是不纯粹恰恰是成熟的标志——多语言持久化polyglot persistence让每种数据待在最适合它的家里。别背表问自己三个问题① 读写形态是什么② 需要多强的一致性③ 会长到多大、访问多频繁一个现成的活教材AI 对话产品模板 里用户和计费数据用关系型、会话历史用文档型、知识检索用向量库、模型权重用对象存储、用量流水用时序——同一个产品五种存储各司其职。一致性谱系从分毫不差到迟早一致一致性不是开关是一条谱系强一致 ◀──────────────────────────────────────▶ 最终一致 扣完款余额立刻全网都对 你点了赞别人可能几秒后才看到 1 严谨、代价高、难扩 宽松、好扩、高可用CAP 定理的人话版本CAP 常被讲得很玄其实核心就一句大白话当网络故障把系统切成互相联系不上的两半时分区 P你只能二选一要么继续服务但可能给出不一致的数据选 A要么宁可不服务也不给错数据选 C。关键在于网络分区P不是你能选的——只要是跨机器的系统网络迟早会抽风。所以 CAP 的真实含义是选 CP一致性优先适合钱、账、库存选 AP可用性优先适合点赞数、浏览数、动态流。哪些数据该强一致这是个业务判断判断标准只有一个这份数据短暂不一致会造成多大的真实后果必须强一致错了要赔钱/出事可以最终一致短暂不一致没人真的在意 账户余额、支付 点赞数、浏览量 库存扣减超卖是电商命门 社交动态流 唯一性约束用户名不能注册两次 通知、已读状态架构智慧强一致很贵别到处滥用。把宝贵的强一致配额花在真正会出事的地方一个把点赞数也做成全网强一致的系统是在为根本不需要的严谨支付高昂代价。一个真实例子帮你落地抢票系统里座位库存必须强一致超卖就是事故而本场剩余票数的实时展示完全可以最终一致——这正是 StarArena 抢票案例 反复训练的钱货一致性判断。事务与 ACID vs BASE严谨派与务实派当几件事必须要么全成、要么全不成比如转账A 减 100 和 B 加 100你需要事务。传统事务追求ACID字母含义一句话A原子性不可分割出错就整体回滚C一致性事务前后数据都满足既定规则I隔离性并发事务互不干扰D持久性提交成功就永久落地断电不丢但在跨多个服务/数据库的世界里维持 ACID 极其昂贵甚至做不到还记得微服务最大的痛——跨服务事务几乎不可能。于是务实派BASE登场ACID严谨派BASE务实派口号每一步必须绝对正确允许暂时不完美但保证最终对上换来强一致、强保证高可用、高扩展代价难扩、可能拖慢或拒服要容忍中间态逻辑更难写适合钱、订单核心大规模、可容忍延迟的场景在 CAP 上的站位偏 CP偏 AP这不是谁更高级而是站位不同。成熟系统往往混用核心交易走 ACID周边的统计、通知、流式数据走 BASE。数据扛不住了复制、分片、缓存三张牌数据量和访问量涨上来后单库扛不住。你手里有三张牌每张牌解决不同的问题也各有代价手段主要解决怎么工作主要代价复制扩读读多写少一主多从主库写从库分摊读① 主从有延迟从库可能读到旧值② 写能力没扩展主库仍是写单点分片扩写 扩容量按用户 ID 等规则把数据水平切开分散到多台机器① 跨分片事务和 join 基本告别② 分片键选错 热点分片灾难③ 再分片扩容要搬海量数据非常痛缓存扩读 降延迟热点数据放进内存级 KV重复读不打数据库① 一致性难题② 冷启动时所有请求瞬间打到库上一句话区分复制扩读、分片扩写、缓存降延迟并扩读。别指望靠加从库解决写瓶颈——那得靠分片。另外两个关键提醒分片是重武器要尽量晚做、想清楚再做。分片键的选择几乎是一旦定下就很难反悔的决策。三张牌的共同代价是一样的——它们都通过制造数据副本来换扩展性所以一致性都变难了。天下没有免费的扩展。缓存的三大经典坑穿透、击穿、雪崩缓存是用一致性换速度的典型几乎人人都会踩这三个坑坑是什么常见对策穿透大量请求查根本不存在的数据每次都穿过去打数据库常被恶意利用空值也缓存或用布隆过滤器先挡一道击穿某个热点 key 恰好过期海量请求同时涌向数据库重建重建时加锁只放一个请求去查库雪崩大量 key 同时过期或缓存整体宕机流量瞬间全压数据库过期时间加随机抖动缓存本身做高可用还有第 3 个根本难题——缓存与数据库的一致性数据库改了缓存还是旧的。常见做法是更新数据库后删掉缓存但高并发下时序会引出微妙不一致。核心认知只要用了缓存你就主动选择了接受某种不一致。没有完美解只有取舍——比如给缓存设合理的过期时间TTL把脏数据窗口控制在业务能接受的范围内。记住本章主线复制、分片、缓存三者都靠副本换扩展性代价都是一致性变难。为什么数据模型是最难改的决策回到开篇那句逻辑好改数据和状态难改。改代码: 旧代码 ──删除──▶ 新代码 干净、可逆、几分钟 改数据: 几亿条旧数据 ──?──▶ 新结构 必须兼容新旧结构共存 写迁移脚本(可能跑几天) 期间系统不能停 出错还要能回滚 痛苦、危险、以「周」甚至「月」计数据迁移是工程界公认最高危的操作之一它慢、危险、常常不可逆。越是底层的决策——分片键、核心实体关系、一致性级别——改动成本越是指数级上升。所以本章最重的一条建议是数据模型与状态管理要慎重、要尽早想清楚。在 架构师的思考框架需求 → 约束 → 质量属性 → 取舍里数据怎么建模、放哪、多强的一致、怎么扩应该是最早、最认真思考的一部分。该懒的地方懒——逻辑可以先糙后精该较真的地方必须较真——数据模型要尽早想透因为它一旦错了事后修复的代价可能是写代码的一百倍。本章小结与阅读路径主题核心结论状态观无状态好扩、有状态难扩状态既是万恶之源也是价值之源数据放哪为访问形态选存储复杂系统天然多存储混用一致性是谱系不是开关强一致留给钱和库存其余尽量最终一致事务ACID 偏 CP、BASE 偏 AP成熟系统混用扩数据复制扩读、分片扩写、缓存降延迟代价都是一致性数据模型最难迁移的决策务必尽早想透延伸阅读路径均在仓库内05 · 数据与状态原章全文——本讲精读的对象含完整 ASCII 图与随堂检验题06 · 质量属性与取舍——承接本章把一致性放进你永远不可能全都要的取舍棋盘28 · 数据库与存储选型——把本章的为访问形态选存储落成具体的技术选型决策。一句话带走架构的真正难点从来不在逻辑而在数据与状态。想清楚状态你就想清楚了一半的架构。【免费下载链接】awesome-architecture Architecture-first system design: 26 bilingual tutorials, 25 architecture templates, and 6 end-to-end cases covering distributed systems, AI-native systems, RAG, coding Agents, and production trade-offs.项目地址: https://gitcode.com/gh_mirrors/awesomearc/awesome-architecture创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考