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