目录
开始阅读 →

设计事件驱动系统

原著: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 完成,旨在为中文读者提供忠实原著、表达自然的阅读体验。翻译遵循以下原则:

  1. 忠实原意:以英文原版为准,不增删观点;个别原文中的笔误(如 Command Query Response Segregation)按正确术语处理。
  2. 术语统一:全书同一概念使用同一译法,并在首次出现时附英文原文。常用术语见下表。
  3. 人名与产品名保留原文:如 Pat Helland、Martin Fowler、Kafka Streams、KSQL,不做音译。
  4. 代码与链接不翻译:代码块、标识符、主题名与 URL 保持原样,仅翻译代码中的注释。
  5. 图表沿用原编号:图、表的编号及插图与原书一致,图注已译为中文。
  6. 交叉引用中的页码为英文原书页码:如“第 14 章第 135 页”指英文原书的页码,章节名则与本译本的标题一致,便于查找。
  7. 使用“你”称呼读者:保持原书平实、对话式的语气。

如发现翻译错漏,欢迎提交 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
原版语言 英文
在 GitHub 上查看本页或提交勘误 ↗