2天时间,聊今年最热的 Agent、上下文工程、AI 产品创新等话题。2025 年最后一场~ 了解详情
写点什么

构建事件溯源系统时犯的错误和恢复措施

  • 2019-07-17
  • 本文字数:1303 字

    阅读完需:约 4 分钟

构建事件溯源系统时犯的错误和恢复措施

Nat Pryce和他的团队开始构建基于事件溯源架构的新系统时,在设计上犯了几个重大的错误,但最后成功地修复了这些错误,修复过程也并不复杂。在一篇博文中,Pryce 详细描述了他们所犯的错误以及促使他们重构架构并从错误中恢复的因素。


他们犯的第一个错误是,将事件历史和对应实体的当前状态视图一起持久化。当前状态不是由于事件更新而产生的投影,而是由记录事件的命令处理程序来更新的。这就引入了两个问题:一是无法通过记录的事件重建实体的状态;二是在将关系模型中管理方式移植过来管理当前状态,开销也十分巨大。


Pryce(《测试驱动的面向对象软件开发》一书的合著者)承认同时使用这两种持久化机制,在某种程度上忽略了事件溯源的整体要点。造成这个错误的原因是,他们提出这个设计为了让团队满意,而没有反思与事件溯源文献中的建议不符之处。他们按照这个设计一直推进到困难明显超过了优势时才反思。随后,通过技术回顾,他们同意转向规范的事件溯源设计。


他们犯的第二个错误是,混淆了事件驱动架构和事件溯源架构。在事件驱动架构中,组件执行任务以响应接收到的事件,并且发出事件来通知状态的变更。在事件溯源架构中,状态变更被当作事件来记录,并且实体的当前状态是根据与实体相关的所有事件计算得出的。对两者的混淆导致产生了这样的设计:对于一个组件来说,既记录了它历史上的所有事件,它又触发了其他组件中的活动。当他们必须在事件中实现相应逻辑以区分,a)读取事件并对其作出反应,和 b)读取事件以了解其历史事件时,他们才意识到了这个错误。


这种混淆也导致了他们将事件存储用作消息总线的设计。消息总线需要发出通知,使组件能够保存最新的投影,这意味着他们使用事件存储来记录事件历史和组件之间的瞬态通信。这使得他们在使用事件存储前,必须从历史中过滤掉的技术事件。


Pryce 描述的最后一个错误是,使用 HTTP 接口在事件存储中读取和存储事件。这阻碍了团队使用ACID事务处理事件,从而迫使他们不得不构建其他机制来试图缓解事务处理的情况。


幸运的是,在线上系统的事件历史受到影响之前,他们早就发现了所有错误。 HTTP 接口已替换成命令处理器的直接数据库连接。他们停止了使用消息通知,转而使用 REST 在组件之间传递数据 。最后,他们去除了命令处理程序中对实体的当前状态的更新逻辑。相反,状态是在加载实体时根据事件历史计算的。他们仍然使用事件当前状态的投影,但这纯粹是为了优化,作为一个直读缓存使用。


Pryce 最后指出,尽管他们对架构进行了重大变更,但这些变更很简单,并且他指出这样做的原因与事件溯源是正交的。


他们的应用程序采用了端口和适配器架构(六边形架构),采用这种架构很容易变更隐藏在端口或适配器接口背后的具体实现。利用端口和适配器架构,还可以编写大量的功能测试。采用该架构,可以实现技术架构与功能实现的分离,这样,技术架构变更时就简单多了。


如 Pryce 所说,当你在系统中采用一种不熟悉的架构风格时,不可避免地会犯错误。他认为,端口与适配器风格不仅允许他们在缺乏经验的情况下采用事件溯源架构,但也可以让他们在构建系统时的误解中恢复过来。


原文链接:


Mistakes and Recoveries When Building an Event Sourcing System


2019-07-17 08:004056
用户头像

发布了 566 篇内容, 共 410.4 次阅读, 收获喜欢 731 次。

关注

评论

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

区块链将在元宇宙旅游中发挥哪些价值?

CECBC

架构实战营第 4 期 -- 模块四作业

烈火干柴烛灭田边残月

架构实战营

HarmonyOS(鸿蒙)——单击事件

李子捌

28天写作 21天挑战 12月日更

元宇宙如何改写人类社会生活

CECBC

微服务架构下请求调用失败的解决方案

JavaEdge

12月日更

一指阁:用宜搭实现全面数字化管理,助力企业打开十亿市场新空间

一只大光圈

阿里巴巴 低代码 数字化 钉钉宜搭

读《思辨与立场》-09决策的艺术10掌控你的非理性倾向

wood

28天写作 批判性思维 思辨与立场

5G很美丽,也要解好题:为什么今天必须关注5G-Advanced?

脑极体

面试官:说说32位和64位

喵叔

28天写作 12月日更

优酷弱网平台落地实践

阿里巴巴终端技术

弱网 弱网环境高可用

数字化石油的开采利器:智能图像识别系统

百度大脑

人工智能

阿里云混合云重磅亮相中国信通院2021混合云大会

Agora Flat:在线教室的开源初体验

RTE开发者社区

人工智能 开源 flat

案例应用 l 机器视觉"OCR识别"技术,高效解决医疗药盒字符检测难题

矩视智能

机器视觉 工业视觉 工业机器视觉 工业界机器学习

如何利用区块链提高供应链金融数字化水平?

CECBC

Yes And

将军-技术演讲力教练

十大排序算法思想与Python实现

宇宙之一粟

Python 排序算法 12月日更

从350ms到80ms,打造新零售场景下 iOS 短视频的极致丝滑体验

阿里巴巴终端技术

ios App 短视频 移动开发

百分点认知智能实验室:基于NL2SQL的问答技术和实践

百分点科技技术团队

关于Stream转Map的Duplicate key异常处理

一盐难进

java基础

LabVIEW灰度图像操作与运算(基础篇—2)

不脱发的程序猿

机器视觉 图像处理 LabVIEW 灰度图像操作与运算

Hoo虎符研究院 | 币海寻珠——2021年12月月底NFT榜单(2021.11.22 - 2021.12.21)

区块链前沿News

NFT 虎符交易所 虎符研究院 Hoo交易所

盘点 2021|日更一年的收获与改变

石云升

28天写作 12月日更 盘点2021

Redis AOF 持久化详解

程序员历小冰

redis aof 28天写作 12月日更

技术进步和个人幸福

mtfelix

28天写作

Golang中的协程是干什么用的?

liuzhen007

28天写作 12月日更

农信机构如何推动供应链金融?

CECBC

mybatis中如何防止sql注入和传参

网络安全学海

黑客 网络安全 信息安全 渗透测试 安全漏洞

Java 中的 xx ≠ null 是什么新语法?

CRMEB

Flink CDC 系列 - 同步 MySQL 分库分表,构建 Iceberg 实时数据湖

Apache Flink

大数据 flink 编程 后端 实时计算

学习基本黑客技术

喀拉峻

网络安全 安全 渗透测试

构建事件溯源系统时犯的错误和恢复措施_语言 & 开发_Jan Stenberg_InfoQ精选文章