事件溯源与流处理的对比

2016 年 6 月 02 日

架构

事件溯源(event sourcing) CQRS 是在领域驱动设计(Domain-Driven Design,DDD)社区出现的两个模式。流处理(Stream processing)构建在类似的理念上,但是它来源于不同的社区, Martin Kleppmann 在今年的领域驱动设计欧洲会议的演讲中,将事件溯源与流处理进行了对比。

Kleppmann 之前有在互联网公司构建大规模数据系统的背景,但是他目前就职于剑桥大学,在将企业级软件与互联网公司的系统进行对比的时候,Kleppmann 指出,它们主要的差异在于复杂性所在的位置不同。在企业级软件方面,复杂性主要在于领域模型和业务逻辑。在互联网公司中,领域模型相对会比较简单,但是它会快速产生数量非常大的数据,这导致了数据基础设施的复杂性。尽管这两个方面都有其复杂性,而且产生的原因各异,但是 Kleppmann 发现它们的解决方案是类似的,在企业级领域采用的是事件溯源,而在互联网方面,采用的则是流处理或者不可变事件的序列(sequences of immutable events)。

Kleppmann 提到了处理事件流的一个工具,那就是 Kafka 。最初开发它的目的在于聚集日志文件和处理事件。它是基于非常简单的理念构造的,Kleppmann 将其类比为可以附加(append)日志内容的日志文件,不过这里不断添加的是新的消息或事件。这样会创建出按序排列的记录序列,它可以用来统一地处理任意事件流。Kafka 一个很重要的特性就是在它跨服务器分布的时候,能够处理大量的事件。

使用 Kafka 实现的一个很有意思功能就是为数据库变更事件创建事件流,Kleppmann 认为这与事件溯源非常类似,数据库每条记录的更新都会产生一个事件,如聚合状态或实体的更新。通过这种方式,在发布并应用更新到本地版本的数据时,客户可以读取到一个事件。Kleppmann 指出这种使用场景类似于数据库复制(database replication),在数据库复制中,会首先写入到一个主数据库中,然后复制到备份数据库中。

在 Kafka 最初所设计的使用场景中,所有的消息出现一定百分比的丢失是可以接受的,但是随着运维经验的不断丰富和成熟,对持久化的预期也在提高,它的复制技术已经达到了很多关系型数据库复制系统的水准。为 Kafka 添加事务支持的工作正在进行之中,它允许以原子的方式自动发布消息到多个分区。Kleppmann 指出,尽管事件流和处理是非常新的技术,但是毫无疑问这种趋势已经进入到很多数据库之中了。

在对比事件溯源与流处理的过程中,Kleppmann 发现特别有意思的一点在于这两个类似的理念来源于两个差异性非常大的社区,而且这两个社区很少有交流。这表明在底层会有一些基础的理念,而这些理念是非常重要的。

QCon 伦敦的演讲中,Kleppmann 讨论了如何使用事件流和Kafka 在异构的系统间保持数据同步。

Kleppmann 演讲的 slides 可以在该地址获取

明年的领域驱动设计欧洲会议计划会在2017 年的1 月底举行。

查看英文原文 Comparison of Event Sourcing with Stream Processing

2016 年 6 月 02 日 19:00 3549
架构

评论

发布
暂无评论
发现更多内容

六、基于多阶段构建减小镜像体积降低复杂度

悟尘

Docker Kubernetes 容器 k8s Compose

高性能交易系统设计原理

廖雪峰

架构

H5功能足够强大,为什么还要微信小程序?

顾强

微信小程序 移动应用

读 Guide to Java String Pool

shengjk1

Java java string pool string pool

VSCode-aliyun-oss-paste-image 插件安装使用指南

悟尘

vscode Paste-image

Redis高可用-哨兵模式配置

for

redis 高可用 主从配置 redis高可用 redis哨兵模式

Netty 源码解析(三): Netty 的 Future 和 Promise

猿灯塔

告诉你一个学习编程的诀窍(建议收藏)

ithuangqing

学习方法 编程 高效学习 自学编程

附录2、Dockerfile 参考及最佳实践

悟尘

Docker Dockerfile

附录3、Docker-compose 命令使用指南

悟尘

Docker Docker-compose

写在开头

杨友峰

Java 期现

Hexo-deployer-cos-cdn 插件安装使用指南

悟尘

Hexo COS CDN Hexo-deployer-cos-cdn

spring-cloud-stream 集成 rocketmq

再见孙悟空

RocketMQ Spring Cloud

Hexo-admonition 插件安装使用指南

悟尘

Hexo Hexo-admonition Admonition

为什么说此前的WiFi安全方案都是小弟?

石君

wifi 无线网络 无线网络安全 Wi-Fi安全

从少儿编程讲讲开发行业的大趋势

kimmking

在线教育 少儿编程

曾国藩家书嘉言钞(六)

熊小北同学

曾国藩 曾国藩家书 嘉言钞

四、Docker 网络原理、分类及容器互联配置

悟尘

Docker Kubernetes 容器 k8s Compose

八、Kubernetes 入门实践

悟尘

Docker Kubernetes 容器 k8s Compose

使用Typora + PicGo 图床 + jsDelivr CDN实现高效 Markdown 创作

悟尘

Typora PicGo iPic jsDelivr CDN

意想不到的收获哦

南辞

游戏夜读 | 设计师的数据模型

game1night

Netty 源码解析(二):Netty 的 Channel

猿灯塔

Netty

七、Docker Compose 入门实践

悟尘

Docker Kubernetes 容器 k8s Compose

源码分析 Vector 和 ArrayList

张sir

Java 源码 collection

Node.js 必知必会(安装配置、应用实例及同步控制)

悟尘

node.js

长假将至,推荐两个好东西

池建强

算法 视觉笔记

五、Docker 数据持久化存储与性能调优

悟尘

Docker 容器 k8s Compose kubernet

附录1、Docker 常用命令及示例

悟尘

Docker 容器

附录4、Docker-compose 配置文件编写指南

悟尘

Docker Docker-compose

程序员到底应该学习什么语言好?

页面仔小杨

跨越计算鸿沟:如何靠软硬件协同突破算力瓶颈?

跨越计算鸿沟:如何靠软硬件协同突破算力瓶颈?

事件溯源与流处理的对比-InfoQ