写点什么

将整个系统建立在事件溯源上是一种反模式

  • 2016 年 5 月 17 日
  • 本文字数:1175 字

    阅读完需:约 4 分钟

在今年早些时候所举办的领域驱动设计欧洲大会上, Greg Young 进行了一场演讲。他在演讲中表示,命令查询职责分离模式(CQRS)从来都不是我们所致力于实现的终极目标,它只是带领我们迈向事件溯源(Event Sourcing)模式这一终点的阶梯。不过,他同时也认为,即使我们仅仅采纳了CQRS 模式,将应用的读写进行分离,而仍然使用同一个数据库,这也同样是一种有价值的模式。他曾见过许多团队以这种方式构建系统。

Young 回顾了事件溯源模式在这 10 年来的发展,他看到这一模式已在许多新领域中实现了突破,而不仅仅限于具有大量事务写入操作的传统领域,例如金融与博彩领域。对事件的建模促使开发者更为关注软件的行为,而不是其结构,这种方式在和习惯与传统软件打交道的领域专家进行交流时将体现出更为明显的作用。此外,对事件的建模也促使开发者更关注于瞬时的状况,在这种系统中,时间就成为了一个至关重要的因素。对于各事件随着时间流逝而产生的相互关联的思考,往往会使我们了解核心的领域知识。

在过去几年中,事件风暴(Event Storming)这种形式获得了极大的成功。对此,Young 表示对事件的建模并不只这一种形式,他提到了 Alberto Brandolini 所介绍的一种形式,即以一种探索式的方式找到领域中的问题。Young 本人也会使用另一种形式,只关注于某一个流程,这种形式的目的在于发现服务的边界。他期望事件风暴过程未来能够变得更为正规化,并鼓励听众多加以关注。

而 Young 在过去 10 年间所见到的最糟糕的做法,就是将整个系统建立在事件溯源模式之上这种常见的反模式。这是一种严重的错误,会造成一个基于事件溯源模式的整块应用。CQRS 与事件溯源都不是顶层的架构,应当有选择性地在少部分场景中使用。

Young 所提到的最后一个问题是流程管理器(Process Manager)的缺失。如果所构建的系统中的大量服务直接订阅由其他服务所生成的事件,会使开发者难以理解系统的实际工作方式。除非能够逐个翻阅每个服务中的代码,否则将很难发现整个流程的真实面貌。Young 指出,虽然流程管理器的设计并不容易,但他相信其原理已经在《企业整合模式》(Enterprise Integration Patterns)这本书中得到了最好的解释。

Young 也对未来进行了一番展望,他相信会出现更多通过函数式编程进行事件溯源开发的情形。他表示,虽然事件溯源模式往往与面向对象思想相结合,但它却是一种纯粹的函数式模式,因此非常适合于用函数式代码进行表达。在他看来,将有越来越多的事件溯源系统基于函数式代码进行开发。

Young 同时也相信流程管理器的使用将变得更为普及,而 Actor (角色)模型越来越广泛的应用也将对此起到积极的推动作用,因为在 Young 看来,Actor 就是实现流程管理器的完美选择。他甚至将 Actor 框架描述为一种流程管理器框架。

明年的领域驱动设计欧洲大会预计将在2017 年1 月底举办。

查看英文原文 Event Sourced Systems is an Anti-Pattern

2016 年 5 月 17 日 19:002607
用户头像

发布了 428 篇内容, 共 161.2 次阅读, 收获喜欢 31 次。

关注

评论

发布
暂无评论
  • 领域事件:解耦微服务的关键

    这种事件发生后通常会导致进一步的业务操作,在DDD中这种事件被称为领域事件。

    2019 年 10 月 25 日

  • 使用 DDD、事件风暴和 Actor 来设计反应式系统

    领域驱动设计(DDD)通常在微服务领域用于查找边界(限界上下文)。但是,并不是领域驱动设计中的所有内容都适合微服务,Lutz Huehnken在柏林举办的microxchg 2018上的演讲中讨论了如何使用DDD、事件风暴和基于Akka的Lagom框架来构建反应式系统。

  • 用示例程序介绍 CQRS 和事件溯源机制

    Sacha Barber在提升自己对CQRS设计所包含的架构和模式的理解过程中,创建了一个包含事件溯源机制的CQRS完整演示程序,并撰写了一篇文章对程序的内部工作机理做了详尽的解释。

  • Dino Esposito 对于 CQRS、消息以及事件的看法

    Dino Esposito在MSDN杂志上所发表的三篇系列文章中表示:命令查询职责分离(CQRS)架构是系统架构变革的一个起点,它将对整个架构带来深远的影响。CQRS是软件架构师的设计理念从“需要持久化的模型”逐渐演变为“需要进行日志记录的事件”的第一步。

  • 通过示例理解事件流处理的概念和意义

    将数据组织为事件流这种思想在许多领域中都已得到应用,这也是一种保存数据的理想方式。将事件聚合为一个read model是一种将数据展现给用户的理想方式。Martin Kleppmann在介绍流处理、事件溯源或复杂事件处理等概念的基本思想时,专门讲述了这方面的内容。

  • 使用 Axon 框架实现一个 CQRS 示例应用

    命令查询职责分离(CQRS)的思想是将对状态的查询部分与改变状态的部分进行分离。Axon框架是一个基于Java实现的CQRS框架,提供了对大多数重要构建块的实现,以帮助开发者在构建应用程序时使用CQRS架构模式。Dadepo Aderemi最近撰写了一系列博客文章,通过一个小型的CQRS演示应用讲解了CQRS的概念。

  • 当 DDD 遇上 DCI(Data, Context, Interactive)架构模式丨 Archsummit

    DCI是数据、场景、交互(Data、Context、Interactions)简称,重点是关注数据的不同场景的交互行为,是面向对象系统状态和行为的一种范式设计;DCI在许多方面是许多过去范式的统一,多年来这些模式已经成为面向对象编程的辅助工具。

  • 面向模式软件架构第 4、5 卷出版

    面向模式软件架构(POSA)系列的第4卷和第5卷已经出版了。卷4是关于分布式计算的模式语言,而卷5则“深入审视模式是什么,不是什么,以及怎样成功地使用它们”。InfoQ采访了作者以获得更多信息。

  • 比较:Jetty 的线程策略 EatWhatYouKill

    根据Jetty的官方测试,EatWhatYouKill这个线程策略将吞吐量提高了8倍,你知道它是如何实现的吗?

    2019 年 6 月 22 日

  • 使用反应式领域驱动设计来解决不确定性

    Vaughn Vernon撰写了几本关于DDD和反应式消息传递模式的书,并发现分布式系统的本质意味着你必须处理不确定性。如何响应丢失的消息或重复收到的消息应该是一种业务决策,因此必须是领域模型的一部分。

  • 论领域驱动设计在微服务开发中的作用

    在近期于德国柏林举办的microXchg大会上,来自innoQ的Michael Plöd在一场演讲中谈到了如何在开发微服务的过程中使用领域驱动设计(DDD)的话题。在他看来,微服务与DDD之间的联系不仅仅只限于界限上下文(Bounded Context)的概念而已,虽然界限上下文确实是一种可用于定义微服务粒度的基础工具,但其他一些概念也同样重要。相应地,DDD也不单纯地代表实体、值对象与repository等概念而已。

  • 限界上下文:定义领域边界的利器

    如果不考虑技术异构、团队沟通等其它外部因素,一个限界上下文理论上就可以设计为一个微服务。

    2019 年 10 月 18 日

  • 从事件和 DDD 入手来构建微服务

    领域驱动设计(Domain-Driven Design,DDD)是一项很伟大的技术,它拉近了设计与程序实际所服务的领域,但是通常我们会关注结构,从而太早地做出决策,这并非DDD的本意。相反,在领域中,我们应该从事件开始,Russ Miles描述了在构建微服务时,采用“事件优先”的方式所具有的优势。

  • 事件应该成为开发者的一等工具

    这篇文章以Stitch Fix公司的一个工作流程为例,说明了如何使用事件来创建状态机。文章建议我们应该把事件看作是系统中的一等公民,因为它们帮助我们解耦系统,让我们能够独立处理各个部分。最后,文章用代码版本控制为例来帮助读者理解事件思想在实际工作中的应用。

  • Vim 的四种模式

    2019 年 6 月 20 日

  • MySQL 主从数据库同步是如何实现的?

    主从同步做数据复制时,一般可以采用几种复制策略。性能最好的方法是异步复制。

    2020 年 3 月 26 日

  • .NET 中的 Command(命令)模式

    在Command(命令)模式中,使用对象来表示和封装稍后调用该方法所需的全部信息——这些信息包括方法名、拥有该方法的对象、及参数值。在系列文章“.NET中的Command(命令)模式”的第一部分中,Eric Vogel介绍了在WPF应用程序上下文中对ICommand接口的使用。

  • 第 143 讲 | 徐毅:技术 Leader 应该具备的能力或素质

    技术领导者(Technical Leader)要习惯从以往只要自己做好就一切都好的状态,转到大家好才是真的好的状态。

    2018 年 12 月 20 日

  • Jonas Boner 谈 Events 将如何重塑现代系统

    Lightbend的创始人兼首席技术官Jonas Boner在最近的Reactive Summit 2017 会议上做了主题发言,谈到了事件驱动型服务(event driven services),以及事件驱动架构(EDA)和事件流处理(ESP)技术将会给基于分布式系统的现代应用程序的设计带来哪些帮助。

发现更多内容

C语言_Linux基本命令与C语言基础

DS小龙哥

5月月更

《对线面试官》Java注解

Java3y

Java 程序员 面试 编程语言 5月月更

2021-6-1【利用指针方法求数组的最大值和最小值】

爱好编程进阶

Java 程序员 后端开发

【Go实现】实践GoF的23种设计模式:建造者模式

元闰子

Go 设计模式 建造者模式

10-2 5-2 查询至少生产两种不同的计算机(PC或便携式电脑)且机器速度至少为133的厂商 (20 分)(思路加详解+测试用例

爱好编程进阶

程序员 后端开发

2021 年最新版 68道Redis面试题,20000字,赶紧收藏起来备用

爱好编程进阶

Java 程序员 后端开发

MongoDB 入门教程系列之三:使用 Restful API 操作 MongoDB

Jerry Wang

数据库 mongodb 分布式数据库 分布式数据库mongodb 5月月更

MongoDB 入门教程系列之二:使用 Spring Boot 操作 MongoDB

Jerry Wang

node.js 数据库 mongodb 分布式数据库 5月月更

聊聊 C 语言和 ABAP 这两门编程语言的关系

Jerry Wang

编程语言 C语言 SAP abap 5月月更

SpringSecurity认证流程分析

周杰伦本人

5月月更

15-拦截器

爱好编程进阶

Java 程序员 后端开发

320000字2021春招高频面试真题汇总

爱好编程进阶

Java 程序员 后端开发

企评家,打造专业的企业大数据SaaS平台

企评家

企业大数据 企评家 企业成长性评价

50道大厂经典Spring面试题,你能答出来几题?

爱好编程进阶

Java 程序员 后端开发

从零构建物联网平台-给个理由先

老任物联网杂谈

物联网平台

apk瘦身;如何缩小体积呢?这篇文章来教你

爱好编程进阶

Java 程序员 后端开发

网站开发进阶(二十六)JavaScript 实现页面刷新方法汇总

No Silver Bullet

JavaScript 页面刷新 5月月更

用户行为分析模型实践(二)—— 漏斗分析模型

vivo互联网技术

大数据 数据分析 Clickhouse

2个不同的对象集合如何取交集和差集

爱好编程进阶

Java 程序员 后端开发

Docker下的Spring Cloud三部曲之一:极速体验

程序员欣宸

Java Spring Cloud 5月月更

将整个系统建立在事件溯源上是一种反模式_语言 & 开发_Jan Stenberg_InfoQ精选文章