写点什么

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

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

关注

评论

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

这个提升效率宝藏级工具一定要收藏使用

秃头小帅oi

Go 框架选型指南:为什么我们团队最终选择了它?

vison

Go gRPC Backend Developer gin

可以显著提升脚本的健壮性和效率

Joseph295

领航智能运维新时代!嘉为蓝鲸与三大客户联合斩获央国企数智化转型案例殊荣

嘉为蓝鲸

智能运维 数智化转型

从数据到决策:CMDB消费在故障预警与根因分析中的实践

嘉为蓝鲸

AIOPS CMDB 智能运维

三类不同身份的“开发者”,在昇腾CANN的土壤上种下了繁荣之花

极客天地

无需公网IP,内网穿透远程访问Ollama+Gemma3模型+Open WebUI教程

贝锐

内网穿透 ollama Gemma

《Building REST APIs with Flask》读后感

codists

flask

JeecgBoot v3.8.1发布,集成AI应用的低代码平台

JEECG低代码

低代码平台 代码生成 AIGC JeecgBoot AI低代码平台

set -euo pipefail

Joseph295

Gartner推荐的容器监控系统管理实践——嘉为蓝鲸监控中心

嘉为蓝鲸

AIOPS Gartner 智能运维 可观测

基于 AI 网关和 llmaz,提升 vLLM 推理服务可用性和部署易用性的实践

阿里巴巴云原生

阿里云 云原生 Higress

现代财务——智能技术背景下的企业变革

智达方通

企业管理 全面预算 财务管理

MaxCompute x 聚水潭:基于近实时数仓解决方案构建统一增全量一体化数据链路

阿里云大数据AI技术

人工智能 数据挖掘 数据库 数据分析 数据处理

京东币链科技严正声明:澄清稳定币及合作虚假信息,暂未设立相关社区

TechubNews

淘宝API系列:淘宝商品评论API接口详解

tbapi

淘宝API 天猫API 淘宝商品评论API 天猫商品评论API

如何快速打印CAD图纸?怎么设置?

在路上

cad cad看图 CAD看图王

如何安装CST软件拓展资料包

思茂信息

cst CST软件 CST Studio Suite

吉利银河A7全球首秀,2L级油耗引领电混家轿进入新时代

极客天地

Community Over Code Asia 2025DataOps专题:SeaTunnel社区出品并将带来多个分享!

白鲸开源

开源 技术 数据集成 Apache SeaTunnel CommunityOverCode

Iceberg在图灵落地应用

百度Geek说

嘉为蓝鲸 CCI 持续集成平台:K8s 集群集成优化容器构建体验

嘉为蓝鲸

DevOps 智能运维 k8s集群

CAD图层是干什么用的?怎么设置?

在路上

cad

ZFile+内网穿透工具,无需NAS、无需公网IP搭建私有网盘/私有云

贝锐

内网穿透 NAS

全球第一!百度文库智能PPT月访问量超3400万,用户规模翻倍增长

极客天地

打造鸿蒙系统中最好用的加载动画和提示弹窗

幽蓝计划

harmony HarmonyOS NEXT

数据可视化:5 分钟读懂其核心价值与技术实践

镜舟科技

数据可视化 商业智能 运维监控 StarRocks 跨部门协作

灵活适配团队需求:CFlow 价值流模板高效管理研发全流程

嘉为蓝鲸

DevOps 智能运维 CFlow

Python搭建HTTP服务如何快速远程访问?内网穿透工具一招搞定!

贝锐

Python HTTP 内网穿透

海洋服务业定义以及需要使用堡垒机场景分析

行云管家

网络安全 数据安全

本地部署Jupyter,没有公网IP如何用内网穿透工具实现远程访问?

贝锐

机器学习 内网穿透 jupyter jupyterlab

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