写点什么

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

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

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

关注

评论

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

如何做好FAQ页面的设计

小炮

FAQ

ElasticSearch查询流程详解

IT巅峰技术

观测云社区版发布,免费体验全功能私有化实例!

观测云

运维 可观测性 可观测

关于electron-builder打包遇到的一点点问题

空城机

Electron Node 5月月更

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

Dean.Zhang

一些销售术语

刘旭东

5月月更 销售术语

关于数据保护官DPO(34/100)

hackstoic

企业安全 DPO 数据保护官

架构实战营作业五

热猫

明道云APaaS在酒店业中的应用场景例举

明道云

Apache Calcite SQL验证

不穿格子衬衫的程序员

数据库 大数据 SQL解析 Apche Calcite

在nginx中使用proxy protocol协议

程序那些事

Java nginx 网络协议 程序那些事 5月月更

Gartner发布CIO最新调研结果,可组装EBC备受瞩目

金蝶云·苍穹

数据中心进入“液冷时代”,曙光引领绿色变革

BeeWorks

Hoo网格策略活动仍在进行中 震荡市场持续狂欢

区块链前沿News

量化策略 Hoo 网格

【刷题第六天】35. 搜索插入位置

白日梦

5月月更

企评家|海信视像科技股份有限公司成长性报告简述

企评家

6元自助洗车怎么加盟?有啥门槛

共享电单车厂家

自助洗车怎么加盟 6元自助洗车 自助洗车加盟门槛

GaussDB(for Redis)新特性发布:前缀搜索千倍提升与集群版多租隔离

华为云开发者联盟

redis GaussDB(for Redis) 缓存数据库 多租隔离 前缀搜索

「可视化案例Vol.4」智慧社区,引领社区管理新风向

ThingJS数字孪生引擎

全国唯一!这家企业的工业互联网平台上云啦!

天翼云开发者社区

云计算 解决方案 云服务 工业互联网 云平台

企评家,专注企业评价,为企事业单位提供信息数据支撑

企评家

融云一图看懂 | 居家办公的正确姿势

融云 RongCloud

首次全面定义,《2022企业应用运维管理指标体系白皮书》重磅发布

博睿数据

白皮书 博睿数据

[ts]后台管理数据权限控制实现(无业务修改)

林逸民

typescript 工厂模式 权限控制 依赖注入

小插件大功能!轻量化森BIM插件手把手教学

ThingJS数字孪生引擎

插件 数字孪生 BIM

Golang名库观止 | 配置解析神器viper使用详解

程序员读书

Go golng golang 面试

AIRIOT物联网低代码平台如何配置http客户端?

AIRIOT

物联网 HTTP 低代码平台

当家里小神兽睡醒乱爬导致摔下床后,我决定做点啥

BUG侦探

Python OpenCV WebRTC

新升级!网易数帆轻舟中间件推出运维稳定性管控服务

网易数帆

Kubernetes 运维 云原生 中间件 稳定性

钉钉宜搭发布大学生低代码实践计划,一起为公益发光发热!

一只大光圈

低代码 公益 钉钉宜搭

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