【AICon】硅谷视野+中国实践,汇聚全球顶尖技术的 AI 科技盛会 >>> 了解详情
写点什么

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:002637
用户头像

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

关注

评论

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

百舸争流,奋楫笃行 国产数据库排行榜前10改写,AntDB数据库将继续前行

亚信AntDB数据库

AntDB数据库

数据泄露定义以及危害简单讲解

行云管家

大数据 数据安全 数据泄露 数据运维 数据安全运维

HarmonyOS师资培训:赋能万千开发者,助力鸿蒙生态繁荣

最新动态

我们又更新了一波大厂面经!

王中阳Go

Go 后端 面试题 面经 大厂

Gradle 新功能,你不能不知道

树上有只程序猿

Gradle

亚信科技AntDB数据库荣膺“2023世界计算大会专题展优秀成果”

亚信AntDB数据库

AntDB数据库

目标识别不出来,根据指南配置了环境变量也没有用

矩视智能

深度学习 机器视觉

于璠访谈录 | AI 框架应该和而不同?

开源雨林

开源 ai框架 昇思MindSpore AI for Science

TiDB 企业版全新升级,平凯数据库核心特性全解读

PingCAP

数据库 TiDB 平凯数据库

一种动态实现核隔离的方法

天翼云开发者社区

云计算 运维

科技快讯丨超级“码”力!浪潮海岳inBuilder精彩亮相开放原子1024程序员节

inBuilder低代码平台

1024程序员节

数据库性能优化必读,AntDB-M全局统计信息

亚信AntDB数据库

AntDB数据库

AntDB-M的扩展功能,性能提升和热更新轻松搞定

亚信AntDB数据库

AntDB数据库

简单聊聊远程协同运维定义以及优势-行云管家

行云管家

运维 远程系统 远程协同 协同运维

性能优化必读 | AntDB-M高性能设计之线程池协程模型

亚信AntDB数据库

AntDB数据库

MySQL 到 TiDB:vivo 的 Hive Metastore 横向扩展之路

PingCAP

MySQL 数据库 TiDB

NFTScan | 10.23~10.29 NFT 市场热点汇总

NFT Research

NFT NFTScan nft工具

交易所系统开发 交易所开发成品案例部署

西安链酷科技

合约交易所开发 交易所搭建

Pixelmator Pro for Mac(图像编辑软件) v3.4.3完美直装版

mac

Pixelmator Pro 苹果mac Windows软件 图像编辑软件

信创发展 再添一城!广州亚信技术携AntDB数据库入围广州市软件和信创产业链重点企业代表名单

亚信AntDB数据库

AntDB数据库

DAPP币安链代币合约质押挖矿系统开发源码

l8l259l3365

华锐技术何志东:证券核心交易系统分布式改造将迎来规模化落地阶段

PingCAP

MySQL 数据库 分布式 TiDB

科技快讯丨浪潮海岳inBuilder荣获两项开源大奖

inBuilder低代码平台

TiDB x 汉口银行丨分布式数据库应用实践

PingCAP

MySQL 数据库 分布式 银行 TiDB

Notability for Mac(笔记软件) v4.4.4永久激活版

mac

苹果mac Windows软件 笔记软件 Notability

精彩合集丨全“猿”出击!浪潮海岳inBuilder亮相1024程序员节

inBuilder低代码平台

1024程序员节

“创新深化 数实融合”,AntDB数据库邀您参与“2023世界数字经济大会暨第十三届智慧城市与智能经济博览会”

亚信AntDB数据库

AntDB数据库

AntDB数据库荣获 “2023年信创物联网优秀服务商”

亚信AntDB数据库

AntDB数据库

数据集成实现以及平台安装部署入门

RestCloud

ETL 数据集成

内置视图联动查看器,实现数据关联分析

观测云

可观测性 关联分析 #数据分析

打造次世代分析型数据库(八):高效数据导入导出方案

腾讯云大数据

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