写点什么

事件溯源与流处理的对比

  • 2016 年 6 月 02 日
  • 本文字数:1170 字

    阅读完需:约 4 分钟

事件溯源(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:003819

评论

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

Python+OpenCV检测灯光亮点

不脱发的程序猿

Python OpenCV 28天写作 3月日更 检测灯光亮点

Rust从0到1-基础概念-注释

rust 代码注释

百度飞桨中国行南京站开启!共研AI赋能产业新模式

百度大脑

百度 AI 飞桨

开源项目月刊《HelloGitHub》第 60 期

HelloGitHub

GitHub 开源

实战案例丨分布式系统中如何用python实现Paxos

华为云开发者社区

Python 算法 分布式系统 PAXOS 集群库

Java 并发系列(二):DCL — Double Check Lock

TroyLiu

Java volatile 多线程 synchronized DCL

区块链溯源服务平台,区块链商品防伪溯源解决方案

13828808769

区块链+ #区块链#

“广度”和“深度”,是我最终选择蚂蚁的理由

DT极客

LDO和DC-DC有什么不同?如何选型?

不脱发的程序猿

28天写作 3月日更 LDO DC-DC 电源转换

Python基础之:Python中的异常和错误

程序那些事

Python Python3 程序那些事

Mongodb特定场景性能数十倍提升优化实践(记一次十亿级mongodb核心集群雪崩故障)

杨亚洲(专注mongodb及高性能中间件)

MySQL 数据库 mongodb 架构 分布式数据库mongodb

一个魔幻的框架,3分钟纯 Java 注解搭个管理系统

程序员内点事

Java 大前端 后端

【签约计划】技术编辑能力考核成绩公布

InfoQ写作平台官方

活动专区 签约计划

Python OpenCV setMouseCallback 回调函数,取经之旅第 13 天

梦想橡皮擦

3月日更

Java程序员都要懂得知识点:反射

华为云开发者社区

Java 对象 反射 class 函数

一次客户需求引发的K8s网络探究

京东科技开发者

云计算

python中find_element()和find_elements()的区别

Geek_6370d5

Python

如何学习数据结构与算法

C语言与CPP编程

c c++ 数据结构 程序人生 算法

区块链溯源,茶叶溯源平台的搭建

13828808769

区块链+ #区块链#

在开源的公链上实现隐私保护?静看NA公链 NAC公链创新之路应如何蜕变

区块链第一资讯

【技术面对面】基于场景图的多物体图像生成技术

京东科技开发者

云计算

银四30天,苦心啃透java高级工程师面试1000题,涨薪10K很难吗?

Java 编程 程序员 架构 面试

科技赋能城市建设,英特尔正式发布智慧社区解决方案参考架构

新闻科技资讯

首站重庆聚焦智慧物流、呈现最新AI能力

百度大脑

AI 百度大脑

华为云自研PB级分布式时序数据库揭秘第一期初识GaussDB(for Influx)

华为云开发者社区

云原生 时序数据库 华为云 分布式时序数据库 GaussDB(for Influx)

实现一个“能中断”的ajax

云小梦

JavaScript ajax Promise axios 请求拦截

智慧公安警务系统搭建,警务大数据可视化分析平台解决方案

13828808769

智慧城市

Elasticsearch详细剖析

大数据技术指南

ES 3月日更

企业利用边缘计算的10种方式

浪潮云

边缘计算

云图说|一张图带你了解华为云分布式数据库中间件

华为云开发者社区

数据库中间件 DDM 分布式数据库中间件 华为分布式数据库中间件

区块链溯源,茶叶溯源平台的搭建

13828808769

#区块链#

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