设计事件驱动系统
原著:Designing Event-Driven Systems
作者:Ben Stopford
译者:choongth(中文翻译版)
关于本书
《设计事件驱动系统》(Designing Event-Driven Systems)由 Confluent 的技术专家 Ben Stopford 撰写,以 Apache Kafka 为主要工具,讲述如何用事件和流处理来构建软件系统——从单个应用中的细粒度服务,到横跨整个公司的数据与服务架构。
本书的核心观点是:流处理不只是请求-响应(REST/RPC)的另一种实现方式,而是一次思维方式的转变——把业务看作不断演进的数据流,把服务看作将这些数据流转换为新数据流的函数。作者沿着这条主线,探讨了以下几个问题:
- 事件如何同时承担“通知”与“数据复制”两种角色,使服务之间松耦合又可插拔;
- 事件溯源(Event Sourcing)、CQRS 与有状态流处理如何让系统更易扩展、更易恢复;
- 为什么要把事件流作为公司级的共享事实来源,并让每个服务只保留自己需要的“瘦数据”;
- 在最终一致性的世界里,如何处理一致性、并发、事务(Kafka 的“精确一次”)以及模式的演进;
- 如何用 Kafka Streams 与 KSQL 构建一个完整的流处理服务生态。
全书共五个部分、十五章,篇幅精炼,兼顾概念与实践:前三部分偏重思想与架构,后两部分涉及具体机制与少量代码。书中的示例代码可在英文原书所附的 GitHub 项目中找到。
适合的读者:后端与架构工程师、正在评估或使用 Kafka 的团队,以及希望理解事件驱动架构与微服务数据共享问题的技术负责人。
目录
| # | 章节 | 简介 |
|---|---|---|
| 序言 | 序言 | 作者回顾两段经历——基于事件协作的房产过户系统,以及以消息系统作为“记录系统”的银行级数据服务——并说明全书结构与阅读方式。 |
| 第一部分 | 铺垫 | 介绍背景:为什么需要事件与流,以及 Kafka 是什么、如何工作。 |
| 第一章 | 引言 | 从面向服务架构的得失谈起,提出“共享的事实来源”与“把数据库由内而外翻转”的主张,并概述全书脉络。 |
| 第二章 | 流的起源 | 以移动设备崩溃统计为例,说明流处理的由来,以及有状态流处理的基本形态。 |
| 第三章 | Kafka 是否如你所想? | 将 Kafka 与 REST、企业服务总线、数据库逐一比较,指出它真正的定位:流处理平台。 |
| 第四章 | 超越消息传递:Kafka Broker 概述 | 讲解日志、分区、线性扩展、顺序保证、持久性、压缩主题与长期存储等 Broker 的核心机制。 |
| 第二部分 | 设计事件驱动系统 | 介绍构建事件驱动系统所需的模式与技术。 |
| 第五章 | 事件:协作的基础 | 区分命令、事件与查询;讨论耦合,以及事件的“通知”与“复制”两种用法;介绍事件协作、编舞与编排。 |
| 第六章 | 使用有状态函数处理事件 | 比较事件驱动、无状态流处理与有状态流处理三种方式,说明让服务“具备状态”的收益与代价。 |
| 第七章 | 事件溯源、CQRS 和其他有状态模式 | 阐述事件溯源、命令溯源、CQRS、物化视图,以及用 Kafka 实现这些模式的多种方法。 |
| 第三部分 | 重新思考公司层面的架构 | 把前述思想放到整个组织的尺度上,重新审视数据与服务的共享方式。 |
| 第八章 | 在组织内部共享数据和服务 | 分析封装与数据共享之间的“数据二分法”,指出外部数据应成为架构中的一等公民。 |
| 第九章 | 事件流作为共享的事实来源 | 以“由内而外的数据库”为类比,说明事件流加上各服务私有的视图,如何取代共享数据库。 |
| 第十章 | 瘦数据 | 提倡只保留所需数据、随时可从日志重建视图,并讨论数据分歧问题。 |
| 第四部分 | 一致性、并发性和演化 | 讨论事件驱动系统在一致性、事务与数据演化方面的实际问题。 |
| 第十一章 | 事件驱动系统中的一致性和并发性 | 讲解最终一致性带来的及时性与冲突问题,以及单一写入者原则和乐观并发控制。 |
| 第十二章 | 事务,但并非我们所熟知的事务 | 解释重复问题、幂等性与原子提交,以及 Kafka 事务的内部工作方式与局限。 |
| 第十三章 | 随时间演变的模式和数据 | 介绍用模式管理数据演进、双模式升级窗口、无法读取的消息、数据删除,以及公共/私有主题的隔离。 |
| 第五部分 | 使用 Kafka 实现流处理服务 | 用 Kafka Streams 与 KSQL 动手构建流处理服务。 |
| 第十四章 | Kafka Streams 和 KSQL | 介绍流、表、窗口、连接与状态存储,并用一个电子邮件服务作为示例。 |
| 第十五章 | 构建流处理服务 | 以订单验证生态为例,演示分区、重设键、阻塞式读取、等待 N 个事件等技术,并展望更完整的流处理生态。 |
另附:作者简介
关于翻译
本译本由 choongth 完成,旨在为中文读者提供忠实原著、表达自然的阅读体验。翻译遵循以下原则:
- 忠实原意:以英文原版为准,不增删观点;个别原文中的笔误(如 Command Query Response Segregation)按正确术语处理。
- 术语统一:全书同一概念使用同一译法,并在首次出现时附英文原文。常用术语见下表。
- 人名与产品名保留原文:如 Pat Helland、Martin Fowler、Kafka Streams、KSQL,不做音译。
- 代码与链接不翻译:代码块、标识符、主题名与 URL 保持原样,仅翻译代码中的注释。
- 图表沿用原编号:图、表的编号及插图与原书一致,图注已译为中文。
- 交叉引用中的页码为英文原书页码:如“第 14 章第 135 页”指英文原书的页码,章节名则与本译本的标题一致,便于查找。
- 使用“你”称呼读者:保持原书平实、对话式的语气。
如发现翻译错漏,欢迎提交 Issue 或 Pull Request。
主要术语对照
| 英文 | 译法 | 英文 | 译法 |
|---|---|---|---|
| source of truth | 事实来源 | system of record | 记录系统 |
| Event Sourcing | 事件溯源 | Command Sourcing | 命令溯源 |
| CQRS | 命令查询职责分离(CQRS) | Event Collaboration | 事件协作 |
| orchestration | 编排 | choreography | 编舞式 |
| bounded context | 限界上下文 | single writer | 单一写入者 |
| stream processing | 流处理 | stateful / stateless | 有状态 / 无状态 |
| join | 连接 | enrichment | 数据丰富 |
| materialized view | 物化视图 | compacted topic | 压缩主题 |
| turned inside out | 由内而外翻转 | unbundling | 解绑 |
| state transfer | 状态转移 | write-through | 直写 |
| schema | 模式 | lean data | 瘦数据 |
| exactly once | 精确一次 | idempotence | 幂等性 |
| critical section | 临界区 | rekey | 重设键 |
原著信息
| 项目 | 内容 |
|---|---|
| 原书名 | Designing Event-Driven Systems |
| 出版社 | O'Reilly Media |
| 作者 | Ben Stopford |
| 原版语言 | 英文 |