写点什么

Martin Fowler 谈如何理解事件驱动

  • 2017-03-13
  • 本文字数:1877 字

    阅读完需:约 6 分钟

去年年底,ThoughtWorks 内部开展了一个研讨会,讨论“事件驱动”应用程序的性质。在过去的几年里,他们建立了许多基于事件的系统,有被称赞,也有被吐槽。ThoughtWorks 的北美办公室组织了一次峰会,来自世界各地的 ThoughtWorks 高级开发人员在会上分享了他们的想法。 峰会的最大结果是得出这样的一个结论:当人们谈论“事件”时,他们实际上意味着一些完全不同的事情。 所以 Martin Fowler 花了很多时间试图从中挑出一些有用的模式, 本文就是对这些内容的简要总结。

事件通知(Event Notification)

事件通知是最基本也是最简单的模型。当一个系统发生了变更,它会通过发送事件消息的形式通知其他系统。发送消息的系统不要求接收消息的系统返回任何响应,即使有响应返回,它也不对其进行任何处理。这也就是所谓的“fire and forget”模式。

事件通知的好处在于它的简单性,并且有助于降低系统间的耦合性。不过,如果在一个复杂的生态系统里使用了太多的事件通知,可能会带来一些问题。太多的事件难以跟踪,发生问题难以调试,除非借助完善的实时监控系统。消息流错综复杂,当其规模开始膨胀开来,就会造成隐患。

通知事件不会包含太多的数据,一般只包含了一些 ID 或者链接之类的信息。对于接收消息的系统来说,如果它们想得到进一步的信息,或者要基于当前事件做出一些变更,那么它们就需要向源系统发起请求,以便获取更多的数据。那么问题来了,额外的请求不仅会造成延迟,而且一旦源系统宕机,后续的流程就无法继续进行。

事件传递状态转移(Event-Carried State Transfer)

事件传递状态转移模型比事件通知更进一步,可以看作是对事件通知的改进。这个模型最大的特点是,事件里包含了发生变更的数据。对于接收事件的系统来说,如果想要采取进一步措施,可以直接使用事件里的数据,而无需再次向源系统发起请求,从而降低了延迟。而且就算源系统宕机,也不会影响到后续的流程。

不过,既然把变更数据放在事件里进行传输,那么占用更多的带宽是不可避免的了。而且,如果有多个系统接收事件,那么这些数据就会有多个拷贝。

除此之外,接收事件的系统需要维护事件的状态,从而将原本存在于源系统的复杂性转移到了接收事件的系统上。

事件溯源(Event-Sourcing)

事件溯源的核心理念是说,在对系统的状态做出变更时,把每次变更记录为一个事件,在未来的任何时刻,都可以通过重新处理这些事件来重建系统的状态。事件存储是主要的事件来源,可以从事件存储中重建系统的状态。对于程序员来说,版本控制系统是一个最好的例子。提交日志就是事件存储,而代码工作副本就是系统状态。在某个指定的工作副本上重播提交日志就可以创建另一个工作副本,也就是重建了某个时刻的系统状态。

使用事件溯源的系统有哪些好处?首先,事件存储结构简单,易于存储,它们可以被存储在数据库里、文件系统或者其他任意的存储引擎里。因为记录事件是插入操作,没有修改也没有删除,就不需要用到事务控制,这也意味着可以避免使用锁。所以,使用事件溯源可以提升系统的性能。其次,事件本身可以充当审计日志的作用。如果不使用事件溯源,那么就需要为系统维护单独的审计日志。使用单独的审计日志就意味着有存在两个“真相源”,如果审计日志发生丢失,那么通过审计日志重建的状态与真实的系统状态会不一致。

不过,事件溯源也存在一些不足。如果事件很多,重放事件是一个耗时的过程,而且在重放过程中可能会涉及与第三方外部系统发生交互,所以需要做一些额外的操作。查询某个时刻的状态会变得很麻烦,因为需要通过重播事件来重建当时的状态。解决办法是使用快照。不过,系统没有必要为每次变更都创建快照,而是阶段性地创建快照。在查询状态时,通过在临近的快照上重放少量的事件就可以获得想要查询的状态。

CQRS

CQRS 是 Command Query Resposibility Segregation(命令查询职责分离)的缩写,它将读操作(查询)和写操作(增、删、改命令)进行分离,不仅让逻辑更清晰,而且可以各自进行优化。对于读多写少的系统来说,就特别适合使用 CQRS,因为可以针对读性能和写性能进行优化,而且可以进行横向扩展。

不过 CQRS 的概念虽然简单,但是实现起来相对复杂,而且涉及到很多领域驱动设计的(DDD)概念,最好结合事件溯源一起使用。

更多资料


感谢郭蕾对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们。

2017-03-13 19:002856
用户头像

发布了 322 篇内容, 共 141.3 次阅读, 收获喜欢 146 次。

关注

评论

发布
暂无评论
  • 10 分钟带你彻底搞懂事件溯源架构模式

    讲师介绍: 萧亦然,资深技术专家、TGO 鲲鹏会会员、阿里云 MVP、腾讯云 TVP。 问题背景: 事件溯源(Event Sourcing)是事件驱动的一种架构模式,使用事件来表示系统状态的变更,这样通过事件回放就可以掌握系统中的所有数据和操作结果,即通过事件(Event)来溯源(Sourcing)。在领域驱动设计中,事件溯源是一种非常重要的架构模式,构成了开发应用程序的一种新方法。 内容看点: 时间溯源模式设计理念 实现事件溯源模式

    2022-03-04

  • 10 分钟带你彻底搞懂 DDD 开发框架 Axon

    讲师介绍: 萧亦然,资深技术专家、TGO 鲲鹏会会员、阿里云 MVP、腾讯云 TVP。 问题背景: 当下,随着微服务架构的不断发展,领域驱动设计(DDD)也得到了越来越多的应用。但业界并没有针对如何实现 DDD 中聚合、领域事件等复杂概念提供统一的开发规范。在这个背景下,开发人员迫切希望能够引入即插即用的开源框架,来简化 DDD 应用程序的开发过程,Axon就是这样一款开发框架。 内容看点: Axon 的技术组件 Axon 的应用方式

    2022-03-15

  • 头脑风暴:打家劫舍 2

    你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警 。

    2022-08-08

  • 结课测验|来赴一场满分之约!

    来赴一场满分之约!

    2023-02-28

  • 浅析 HTML 页面的生命周期

    大家好,我是CoderBin,本次讲讲HTML页面的生命周期事件,希望对大家有所帮助。如果文中有不对、疑惑的地方,欢迎在评论区留言指正🌻

    2022-10-24

  • 10 分钟带你彻底搞懂 DDD 中领域事件的实现技术

    2022-08-09

  • 10 分钟带你彻底搞懂 CQRS 架构模式

    讲师介绍: 萧亦然,资深技术专家、TGO 鲲鹏会会员、阿里云 MVP、腾讯云 TVP。 问题背景: CQRS(Command Query Responsibility Segregation)命令和查询职责分离是一种架构模式,这种架构模式把数据操作拆分成命令和查询两种不同类型的操作。CQRS 模式的价值在于能够提高系统性能,也有利于系统的安全性。在领域驱动设计中,CQRS 应用也非常广泛,能够和事件溯源等架构模式组合在一起完成对领域事件的高效处理。 问题看点: CQRS 模式设计理念 整合事件溯源和 CQRS

    2022-03-11

  • 活动回顾 | 基于英特尔技术的端到端音视频优化

    2022网易音视频技术大会回顾,英特尔技术专家张立宇分享的《基于英特尔技术的端到端音视频优化》,了解英特尔在音视频领域的实践。

    2022-09-14

  • 程序员从佩洛西窜访事件中可以学到什么?

    最近美国众议长佩洛西窜访台湾省的事件引起了全国乃至全世界的广泛关注,台海局势骤然紧张,大家这几天的心情也是经历了从起初的义愤填膺到倍感憋屈,再到最后豁然开朗过山车式的心路历程。

    2022-08-09

  • 架构训练营模块五作业

    设计微博系统中“微博评论”的高性能高可用计算架构

    2023-02-10

  • 什么是 WMS 系统?

    什么是WMS系统?

    2023-02-07

  • 如何使用物联网低代码平台进行事件管理?

    事件管理是AIRIOT物联网低代码平台的一个核心功能,AIRIOT具有强大的事件管理功能,支持系统启停、计划事件、自定义指令执行、批量资产操作、数据事件、报警事件等多种事件类型和事件处理机制,覆盖了物联网应用的常用场景和应用需求,能够有效提高管理效率。

    2022-06-16

  • 2022 年 11 月国产数据库大事记 - 墨天轮

    本文为墨天轮社区整理的2022年11月国产数据库大事件和重要产品发布消息。

    2022-12-07

  • 细说 react 源码中的合成事件

    💕 温馨提示: 下边是对React合成事件的源码阅读,全文有点长,但是!如果你真的想知道这不为人知的背后内幕,那一定要耐心看下去!

    2022-12-16

  • 本年度软件供应链攻击事件回顾

    软件供应链攻击在过去几年呈上升趋势,并且迅速成为最危险的安全威胁之一。本文将重点介绍了 2022 年到目前为止观察到的一些最值得注意的软件供应链攻击事件。 

    2022-12-21

  • Qt | 鼠标事件和滚轮事件 QMouseEvent、QWheelEvent

    Qt中的鼠标事件和滚轮事件。

    2022-07-25

  • 【高并发全彩版小册】阿里内部大佬用 7 部分讲懂!百亿级高并发系统

    提到“高并发”相信你们应该都不会感到陌生!此时你脑中应该会浮现好多有关高并发的:业务急剧增长、电商购物、电商秒杀、12306抢票、淘宝天猫各种活动等;都是需要用到高并发的,那么如何去设计一个高并发系统抵挡这些冲击呢?

    2022-11-16

  • 27|迭代三概述:怎样处理规模更大的系统?

    在接下来的第三个迭代中,我们会结合“卷卷通”公司的新需求进一步思考和实战,深化DDD的相关技能。

    2023-02-11

发现更多内容

易观千帆银行用户体验中心:聚焦银行APP用户体验

易观分析

金融 银行 用户体验

避免 10 大 NGINX 配置错误(上)

NGINX开源社区

nginx 架构 配置 配置分析 故障排除

智为链接,慧享生活,荣耀智慧服务,只为 “懂” 你

荣耀开发者服务平台

开发者 安卓 荣耀 honor

安克创新每一个“五星好评”背后,有怎样的流程管理?

科技热闻

Colocate Join :ClickHouse的一种高性能分布式join查询模型

华为云开发者联盟

数据库 后端

SpringBoot+Vue+Flowable,模拟一个请假审批流程!

江南一点雨

Java spring springboot flowable

符合信创要求的堡垒机有哪些?支持哪些系统?

行云管家

信创 堡垒机 信创产业

一文带你了解 HONOR Connect

荣耀开发者服务平台

开发者 教程 荣耀 honor

怎么学自动化测试

和牛

自动化 软件测试 8月月更

一种新的测试方法:视觉感知测试

和牛

软件测试 8月月更

MySQL 原理与优化:Update 优化

老崔说架构

社区动态——恭喜海豚调度中国区用户组新晋 9 枚“社群管理员”

白鲸开源

等保2.0一个中心三重防护指的是什么?如何理解?

行云管家

等保 等级保护 等保2.0 安全等级保护

【荣耀智慧服务】快捷服务开发指南

荣耀开发者服务平台

开发者 App 手机 荣耀 honor

开源一夏 |Spring MVC深度学习

叶秋学长

spring 开源 8月月更

接口测试中,应不应该用数据库

和牛

8月月更

干货:服务器网卡组技术原理与实践

C++后台开发

服务器 交换机 网卡 C/C++后台开发 C/C++开发

产品说明丨如何使用MobPush快速创建应用

MobTech袤博科技

ios android sdk mobpush 智能推送

容器化 | 在 S3 实现定时备份

RadonDB

MySQL 数据库 Kubernetes

异形屏为led显示行业带来更多希望

Dylan

LED显示屏 led显示屏厂家 异形屏

fastposter v2.9.1 程序员必备海报生成器

物有本末

海报生成器 海报编辑器 图片生成 二维码生成

头脑风暴:目标和

HelloWorld杰少

数据结构 算法 LeetCode 8月月更

兆骑科创高层次人才创业大赛平台,投融资对接,双创服务

兆骑科创凤阁

易观分析联合中小银行联盟发布海南数字经济指数,敬请期待!

易观分析

金融 海南数字经济 易观分析

用好 DIV 和 API,在前端系统中轻松嵌入数据分析模块

葡萄城技术团队

前端 嵌入式 BI 可视化数据

兆骑科创创业赛事活动发布平台,创业赛事,项目路演

兆骑科创凤阁

NFT数字藏品——数字藏品发行平台开发

开源直播系统源码

软件开发 数字藏品 数字藏品系统软件开发

8月Meetup | “数据调度+分析引擎”解锁企业数字化转型之路

白鲸开源

mysql进阶(三十三)MySQL数据表添加字段

No Silver Bullet

MySQL 8月月更 添加字段

怎么设计产品手册?用什么设计产品手册?

Baklib

“低代码”编程或将是软件开发的未来

优秀

低代码

Martin Fowler谈如何理解事件驱动_语言 & 开发_ Martin Fowler_InfoQ精选文章