这里是全站文章的归档入口,下面是按时间倒序排列的全部文章。若想按主题浏览,请从首页的专题分类进入。
《Java 消息中间件·事件驱动架构》3.3 模型重建与重放
投影表是可丢弃的派生视图。本节真跑一次完整重建实验:先投影 20 条库存事件,清空表后从位移 0 重放重建并对比两次耗时与一致性,验证事件日志作为唯一事实来源的可复现性,深入讨论重建触发条件、快照优化策略、业务低峰期执行建议与常见注意事项。
posts
这里是全站文章的归档入口,下面是按时间倒序排列的全部文章。若想按主题浏览,请从首页的专题分类进入。
投影表是可丢弃的派生视图。本节真跑一次完整重建实验:先投影 20 条库存事件,清空表后从位移 0 重放重建并对比两次耗时与一致性,验证事件日志作为唯一事实来源的可复现性,深入讨论重建触发条件、快照优化策略、业务低峰期执行建议与常见注意事项。
从「回声」订单与支付的边界争议出发,对比按产品域拆与按技术层拆在所有权、变更频率、事务边界和故障隔离上的差异,说明共享表为什么是最强的耦合信号,并用 Go 实现的 Overlap、Validate 与拓扑排序把模块边界检查变成可执行、可回归的拆分计划。
投影是从事件流到读模型的单向转换。本节用 H2 内存表做投影目标,实测 Kafka 消费者消费事件进投影表的全过程,展示幂等写入、顺序处理、查询验证与错误恢复策略,并对比关系型数据库、Redis、Elasticsearch 等多种存储后端。
CQRS 通过命令与读取分离化解读写冲突。本节用 H2 内存数据库演示命令写入、事件生成与投影更新的完整分离流程,给出可运行的 Java 代码示例,深入对比同步双写与异步事件总线两种同步策略,并提供典型应用场景、反模式警示与事件日志操作日志的区别分析。
事件目录不是文档,是可执行的契约。本节给出 libraryd 的 events.yaml 全量示例,逐字段说明 name、topic、version、owner、key、schema、consumers、compat 各自约束什么;再把目录与 Java record 做双向漂移检查,实测抓出一次字段改名和两个未登记字段,修复后 224 项检查全绿。
事件粒度由聚合根决定,不由表结构决定。本节用 libraryd 的借阅流程画出 Loan、Book、Hold 三个聚合的边界,说明一个事务只改一个聚合、一次状态迁移只发一条事件、跨聚合用事件而不是共享表;并用共享表建模的对照实验给出 3 条事件、19 个字段、四轮级联 120 条的结构比例。
事件不是表变更的别名。本节用 libraryd 的六个业务动作演示识别过程:先把动作、状态迁移与表写入分开列,再从迁移里提取过去时事实,最后用确定性 lint 挡掉 UpdateBookStatus、BookRowUpdated 这类伪事件,给出六个事件的命名对照与 12 个候选名的实测判定。
把事件驱动分成五级:消息传递、领域事件、契约治理、流处理、事件溯源。逐级说明能力、代价与常见误判,给出一份 20 题、按 0/1/2 打分的自评表,并用可运行程序算出 libraryd 当前处在第 2 级、升到第 3 级还差哪两项,最后给出升级动作与不该升级的理由。
事件驱动不是默认答案。先用四个信号判断什么时候该用事件,再用一张决策树把请求驱动、命令、查询、事件分开;接着用 libraryd 的两个反例说明用错位置的代价:借书前异步查库存导致超卖,借完立刻查列表却读不到。文末附串行调用与扇出的对照实验,并说明延迟收益为何不是主要理由。
从 libraryd 的借阅动作出发,把事件、命令、查询当成三种不同的句子:过去时的事实、祈使的请求、只读的提问。用三个 Java record 和一组可运行的进程内总线实验,展示多播与单接收的差别,并演示命令被广播、事件被点对点投递之后各自坏在哪里。
卷三全 50 篇的完整目录:五部分、15 章、45 节,加序、前言与两个附录。每章标注它回答的那个架构问题,并给出三条阅读路径——架构师、开发、评审——以及哪些章节可以跳读、哪些必须配着代码看、每节末尾那条判据在评审时该怎么用,还给出三种路径之外的极简读法。
把这一卷的实验底座写清楚:机器与工具链、Kafka Streams 的最小可运行验证、三个必须自己补的依赖,以及 libraryd-mq 的工程结构与架构图的画法约定。最后说明本卷的验证规矩——什么样的内容算实测,什么情况下必须标注未在本机执行。
从「回声」一次关于要不要拆服务的评审写起,说明团队数、发布冲突率和故障爆炸半径为什么比代码行数更能判断拆分时机,给出可标定的阈值与强、辅助信号的分工,并用 Go 实现的 Trigger 与 Level 把「该不该拆、拆到什么程度」变成可测试、可复盘的判断。
把消息队列当成更可靠的 HTTP,是事件驱动架构最常见也最贵的误用。本序拆开三种典型误用——用 MQ 做同步调用、削峰却不管积压、用事件掩盖领域边界——说明它们各自的失效方式与代价,给出本卷的五条立场和五个自检问题:事件是事实的记录,不是调用的替代品。
卷四目录与学习路径:13 章按能力、案例、决策三段组织,先给依赖图与三条阅读路线的选择依据,再逐章说明每一节回答什么问题、失败场景是什么、触发与退出条件怎么定,并交代代码分级、数字口径、术语约定、不覆盖的范围、学习节奏与全书读完后的自检标准。
四份可以直接复制的模板:带唯一约束的去重表、状态机迁移、同库同事务的 outbox 与其 relay、以及消费—处理—生产的事务生产者。每份都标注它解决哪一类重复、在什么位置仍会留下窗口、以及拼在一起时不能混用的边界条件,另附一张按场景选模板的决策表。
生产端、消费端、broker 端三张配置表,每一项只回答两个问题:它保住了什么,代价是什么。附六组看起来没问题、实际互相抵消的危险组合,以及一份可以直接抄走的基线配置。默认值按 Kafka 4.3.0 与 kafka-clients 4.3.0 列出。
把卷二四十五章的实验汇总成十八个验收场景,每条给出可执行的判据、证据章节和结论;另外单独列出十项本机做不出来因而不能算通过的检查,说明各自的风险。文末附一份可以直接改造成脚本的检查骨架、0/1/2 打分口径,以及卷二遗留问题与卷三的分工安排,方便团队评审时直接对照使用。
可靠性每一项配置都有账单:副本数乘存储、acks 乘内部复制流量、保留期乘天数、跨集群乘出网。本篇不谈具体价格,只给可核算的量——一天 1000 万条 1 KiB 消息,三档方案各需要多少 GB·天、多少出网流量,以及故障时才支付的副本重建成本。每一档都标出它能防住哪种故障,以及哪一笔钱其实可以不花。
三十条可靠性检查项,分生产端、消费端、broker 与主题、数据链路、运维演练五组。每一条都给可观测的判据、对应的章节、以及不达标时的修改动作——判据都是「做一件具体的事,看一次结果」,不是「已配置」。五组各自附一节最容易做错的地方,末附打分口径与按边际效率排序的修改顺序。