如何理解事件溯源

2023-05-16

在近期举行的PHPDublin见面会上,来自DynamicRes的架构师Barry Sullivan被问到“什么是事件溯源”,作为对这个问题的回答,他在博客上写下了这篇文章,详细解释了什么是事件溯源以及事件溯源有哪些好处。以下内容翻译自Barry的博客,已获得作者授权。

Web开发的现状

在详细解释事件溯源之前,先让我们来看看Web开发的现状。

当前的Web开发是以数据库作为驱动的,在设计Web应用的时候,我们会自然而然地将系统设计与数据库存储机制联系在一起。如果使用的是MySQL,我们就会把数据结构设计成表,如果使用的是MongoDB,就会把数据结构设计成文档。这样会强制我们只关注事物的当前状态,我们会想“怎样保存这些数据,以便将来可以再把它们拿出来(或者修改它们)”?

20170908113133420.png

  这种方式存在三个问题。

1. 有悖于我们的思维

人类的思考和交流并不是以状态为中心。如果我们在咖啡店相遇,我会问你“最近可好”?如果你只是告诉我一堆状态却指望我从中猜出发生了什么事情,这是非常不合情理的。

“我有一幢房子、一辆汽车、一个冰箱、三个社交媒体账号、一只猫咪,我的右脚有点痛,我不擅长聊天,我还有另一只猫咪……”

看到没有?这样我会疯掉的。你应该告诉我,从上次见面之后都发生了哪些事情,这样我才能知道你现在的状况是什么样子的。简单地说,你应该告诉我一个故事,这个故事是由一连串事件组成的。

2. 单一的数据模型

在上图中,读写操作使用了相同的模型。我们从写数据的角度来设计表,然后基于这样的结构查询数据。这对于小型的应用来说是没有问题的,但用在大型的应用里就会有问题。随着系统的增长,查询会变得越来越复杂,总有一天,一个查询可能会包含10个连接操作,代码有100行那么多。系统很快就会变得脆弱无比,难以维护和变更。

3. 关键业务信息的丢失

这是一个大问题。在以表作为驱动的系统里,你只保存了系统的当前状态,你根本就无法知道系统是如何达到当前状态的。如果我问你“这个用户修改了几次邮件地址”,你有办法回答吗?或者我再问“有多少人把一件商品添加到购物车里,然后又移除掉,直到一个月之后才买了那件商品”,你就更没法回答了。你存储数据的方式丢掉了很多有用的业务信息!

事件溯源

事件溯源与上述的情况恰好相反,它并不关心当前状态,而是关注持续不断的变化事件。

举个例子,假设我们有一个“购物车”,我们可以创建购物车,往里面添加商品或移除商品,然后结账。

购物车的生命周期可以包含如下一系列事件:

创建购物车往购物车里添加商品再次往购物车里添加商品从购物车里移除商品结账

这些就是一个购物车的生命周期,包含了一系列事件。这就是事件溯源,非常简单吧?

20170908113133197.png

几乎所有的流程都可以被看成一系列事件。在与领域专家交谈时,他们不会提及“表”和“连接”,他们会将流程描述成一系列事件以及可以应用在这些事件上的规则。

如何实施业务规则?

大部分的业务操作都有硬性约束。对于购物车来说,它的约束就是“一件商品必须先被放进购物车后才能被移除”。如果一件商品没有被添加到购物车里,又怎么能够移除它?这种事件顺序是不可能发生的。在没有状态的情况下,你怎样才能知道“购物车里是否有这件商品”?

很简单,你只要检查之前是否发生过“商品被添加到购物车里”这个事件,这样你就可以知道购物车里是否存在这件商品,然后移除它。

这样不会浪费时间吗?

一点也不。一般来说,要执行约束,只需要获得事件的一个很小子集。通过简单的数据库查询就可以获得有用的历史事件,在加载完这些事件后重放它们,把它们“投射”出来,以此构建你的数据集。这样的操作其实是很快的,因为你使用的是本地的处理器,而不是执行一系列SQL查询(跨域网络的调用要比本地操作慢得多,至少会相差两个数量等级)。

如何展示数据?

如果说每一个状态都是通过重放事件来获得的,那么该如何抓取数据并把它们展示给用户看?每次都需要抓取所有的数据然后再构建这些数据集吗?

答案是你没必要这样做,这样做其实是很荒唐的。

你可以在后台构建数据集,然后把中间结果保存在数据库里。这样,用户就可以在很短的时间内查询到这些数据。

20170908113133166.png

有了事件溯源,你就不再局限于当前的表结构。需要做其他的查询?只要设计一个新的结构就可以了。你可以自由地实现各种读取模型,在不需要它们的时候再把它们抛弃掉。

事件溯源的好处

1. 临时的数据结构

因为所有的状态都可以通过重放事件获得,所以就没有必要把当前“状态”与应用程序绑在一起。如果需要以新的方式查看数据,直接创建新的数据视图即可。不再需要繁杂的数据迁移脚本,要做的只是创建新视图,抛弃旧视图。我现在几乎离不开事件溯源了。

2. 与领域专家的沟通变得更简单

正如之前所述,领域专家通常将业务流程描述成一系列事件,而不是状态。基于事件溯源的系统与领域专家的描述不谋而合,所以就没有必要把他们的描述转换成技术概念,这样也避免了信息丢失。与领域专家的沟通因此变得更加顺畅,因为我们正在使用他们能够理解的语言与他们沟通,这也让软件开发变得很不一样。

3. 极具表现力的模型

在事件溯源模型里,事件是一等对象,事件模型更加接近于实际的业务流程。这让很多东西都变得清晰明了,你就不会陷入存储技术的泥潭。

4. 生成报告更轻松

在事件溯源系统里,生成复杂的报告是一件轻而易举的事情。你拥有完整的历史事件,它们按照时间排序,你可以尽情地使用这些历史数据。

以之前的例子为例,假设你想知道有多少个用户从他们的购物车里移除了商品,却在一周后购买了这些商品。按照一般的开发方式,通常需要几周的时间才能开发出这个功能,而在发布之后,需要等上一段时间,等计算完所有数据之后才能生成报告。而在事件溯源系统里,你可以马上得到报告。你还可以得到之前任何一个时间点的报告,仿佛拥有了一台时光机。

5. 服务集成唾手可得

在标准的Web开发流程里,集成两个系统通常会导致他们之间的耦合,而事件溯源系统通过事件来解耦被集成的系统。当一个系统发生某系事件需要触发另一个系统的某个流程时,只需要写一个事件监听器即可。这种机制可以让你在不修改已有领域代码的情况下增加新的集成逻辑或特性。

例如,你想要在用户注册的时候发送一封欢迎邮件给他们,你只需要创建一个事件监听器,监听“用户注册”事件,而不需要去修改注册逻辑代码。

6. 在一般的数据库上也能健步如飞

你不需要使用多么奇特的数据库来存储事件,一般的MySQL数据库就足以。数据库都针对追加操作进行过优化,所以存储数据的速度是很快的。这也就是为什么事件溯源在当前的技术条件下能够良好运作,保存事件都是追加操作。

7. 可以随意更换数据库

基于事件溯源的数据结构都是临时性的,所以你可以使用你喜欢的数据库来存储状态,也就是说你完全可以选择最好的工具来完成你的工作。如果你发现了更好的工具,可以在任何时候把旧工具替换掉。我们目前正在从MySQL迁移到OrientDB,可以说是轻而易举。

事件溯源的不足

天下没有完美的东西,事件溯源给我们带来了诸多好处,但也存在一些不足。

1. 最终一致性

事件溯源只能保证最终一致性。也就是说,在一个事件发生了之后,其他系统不会立即感知到它,在它们收到事件之前会有一定的延迟(比如100毫秒),所以你所投射的数据可能不是最新的。这看起来似乎是一个大问题,但其实不是的。例如,基于ReactJS构建的Web应用会基于用户的操作事件构建状态,查询端出现几毫秒的延迟并不会有什么问题。

老实讲,这可以说是塞翁失马,焉知非福。最终一致性的系统具有容错能力,可以解决服务中断问题。如果使用微服务架构或无服务器架构来构建分布式系统,就需要通过最终一致性来保证稳定性。

2. 事件结构发生变化

事件结构会发生变化,如果事先没有考虑到这个问题,后续处理起来会有些麻烦。如果事件结构发生变化,需要写一个更新器来转换新旧事件。转换过程可以在将数据从数据存储中读取出来之后进行。这个没有它看起来那么难,只需要准备好应对策略就可以了。

3. 开发人员需要改变思维

目前的Web开发主要还是以状态作为驱动,所以开发者习惯了从表的角度看待问题,而不是事件。我发现要让开发者改变思维需要一些时间,因为他们需要时间来改变习惯。最好的解决办法是让有经验的事件溯源开发者与传统的开发者结对。

总结

我很喜欢事件溯源,在构建大规模分布式系统时,它帮助我们解决了很多问题。我们可以使用领域专家能够了解的语言与他们进行沟通,我们可以自由地改变和适配系统。尽管事件溯源有一定的学习曲线,但一旦你进入到这个领域,就不会想要回头。


本文转自d1net(转载)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何理解事件溯源 的相关文章

  • Table.Rows.Remove(dr)和Table.Delete()的区别

    一个DataRow对象刚被创建之后其状态是Detached xff0c 是孤立的一个存在 xff0c 所以建立了DataRow之后在DataRow中的单元填充了数据后还要通过DataTable Rows Add DataRow 方法将此Da
  • 【转】CentOS 6.6 升级GCC G++ (当前最新版本为v6.1.0) (完整)

    原文地址 xff1a https www cnblogs com lzpong p 5755678 html 我这里是centos7 升级到gcc8 1 xff0c 过程差不多 xff0c 参考这篇文章 xff0c 记录一下 原文 Cent
  • bmp转jpg(使用libjpeg)

    jpg压缩原理可以参考这篇文章http hi baidu com tiandsp item f5a2dcde6ef1405bd73aae41 xff0c 我很早以前转的一篇文章 没有使用libjpeg的压缩代码可以看看这篇文章http hi
  • Linux学习笔记之九————ubuntu软件安装与卸载

    一 更新 源 1 寻找国内镜像源 所谓的镜像源 xff1a 可以理解为提供下载软件的地方 xff0c 比如Android手机上可以下载软件的91手机助手 xff1b iOS手机上可以下载软件的AppStore 2 备份Ubuntu默认的源地
  • 开源自主导航小车MickX4(六)cartographer 室外2D建图

    开源自主导航小车MickX4 xff08 六 xff09 cartographer 室外2D建图 1 cartographer环境安装1 1 安装ceres库1 2 安装cartographer 2 cartographer demo测试2
  • 使用 vue2+vue-router2+axios+es6+webpack2 完成的 SPA 个人简历

    使用es6 vue2 webpack2 vue router2 axios vue awesome swiper vue spinner SPA 完成的个人简历 访问地址 xff1a https github com vqlai vqla
  • MATLAB中提高fwrite和fprintf函数的I/O性能

    提高 fwrite 和 fprintf 函数的 I O 性能 http www matlabsky com thread 34861 1 1 html 今天我们将讨论下著名的fwrite xff08 fprintf xff09 函数 xff
  • 多项式与连分式函数的计算

    2019独角兽企业重金招聘Python工程师标准 gt gt gt include 34 stdafx h 34 include lt stdlib h gt include lt stdio h gt include lt math h
  • iPad适合写作吗

    我一直感觉对着电脑不利于思考 xff0c 当需要纯粹的思考时 xff0c 我习惯让视线离开屏幕 xff0c 起身走动两圈 xff0c 再用纸和笔整理思路 xff0c 想清楚后 xff0c 开始动手编码 双手端着iPad时 xff0c 似乎也
  • Dell服务器硬件,RAID等查询和维护软件OMSA

    Dell服务器硬件 RAID等查询和维护软件OMSA 2010 09 10 14 34 OMSA OpenManage Server Administrator 是Dell主机的硬件检测和维护软件 OMSA OpenManage 下载地址
  • GVIM设置背景颜色

    首先找到GVim的安装目录 xff0c 在安装目录下你可以发现一个 vimrc文件 使用文本编辑器打开后在里面添加两行代码即可 xff1a 代码如下 set gfn 61 Courier New h14 colorscheme torte
  • 实战ASP.NET访问共享文件夹(含详细操作步骤)

    博客园找找看 xff08 http zzk cnblogs com xff09 的索引文件占用空间太大 xff0c 需要移至另外一台服务器 xff0c 所以要解决 在ASP NET中通过共享文件夹访问索引文件 的问题 假设找找看的ASP N
  • Linux 后台开发工作中常用的开源库

    后台开发 xff0c 语言主要是 c 和 c 43 43 这里简单罗列一下工作中用的很频繁的那些开源软件 1 OpenSSL openssl OpenSSL 是一个安全套接字层密码库 xff0c 囊括主要的密码算法 常用的密钥和证书封装管理
  • [转载]三款SDR平台对比:HackRF,bladeRF和USRP

    这篇文章是 Taylor Killian 13年8月发表在自己的博客上的 他对比了三款平价的SDR平台 xff0c 认为这三款产品将是未来一年中最受欢迎的SDR平台 我觉得这篇文章很有参考价值 xff0c 简单翻译一份转过来 原文在这里 x
  • VINS-Mono运行与评测

    VINS Mono运行与评测 1 修改VINS mono轨迹保存代码1 1 修改 visualization cpp1 2 修改 pose graph cpp1 3 修改VINS mono运行参数 2 EVO 显示轨迹2 1 分析单条轨迹2
  • linux 虚拟机串口通信,单片机和虚拟机里的Linux进行串口通信

    最近在做单片机的火焰传感器采集数据并且并且将危险信息发送给PC端的Linux 一直卡在Linux端的 xff0c 所以 xff0c 做了各种尝试 xff0c 参考了网上一篇大神的代码 xff0c 终于把自己的东西弄了出来 先说明设备吧 xf
  • ArUco----一个微型现实增强库的介绍及视觉应用(二)

    ArUco 一个微型现实增强库的介绍及视觉应用 xff08 二 xff09 ArUco 一个微型现实增强库的介绍及视觉应用 xff08 二 xff09 一 第一个ArUco的视觉应用 首先介绍第一个视觉应用的Demo xff0c 这个应用场
  • ssh连接失败,排错经验

    一 场景描述 ssh连接服务器 xff0c 发现连接失败 xff0c 但是对应服务器的ip能够ping通 场景 xff1a root 64 yl web ssh root 64 10 1 101 35 ssh exchange identi
  • 什么是真正的程序员?

    什么是真正的程序员 这篇文章的原文来自 xff1a A Little Printf Story 作者仿照 小王子 中的情节 xff0c 通过小printf遇见的不同类型的程序员 xff0c 最后悟出什么才是真正的程序员 xff01 第一次翻
  • gpio引脚介绍 树莓派3b_树莓派介绍

    树莓派介绍 陈拓 chentuo 64 ms xab ac cn 2018 05 16 2018 05 16 1 什么是树莓派 xff08 Raspberry Pi xff09 树莓派是由树莓派基金会研发的一种只有信用卡大小的单板机电脑 x

随机推荐

  • 解析kubernetes架构

    一 简介 xff1a kubernetes是一个开源的容器管理工具 xff0c 是基于GO语言开实现的 xff0c 轻量级和便携式的应用 xff0c 可以把kubernetes cluster在linux主机上部署 管理和扩容docker容
  • STM32串口/RS232/RS485

    1 串口引脚 xff0c 如果是异步通讯将UART CLK共地即可 xff0c 如果同步需要时钟 a UART RX 数据接收引脚 b UART TX 数据发送引脚 c UART CLK 时钟引脚 2 UART描述 为全双工 xff0c 异
  • 又是一年年终总结

    起 这篇年终总结草稿是在12 03起的 xff0c 那是突然之间感觉到今年不大平常 xff0c 可以考虑写个年终总结来记录一下 xff0c 但是谁能料到今年真的是太不平常了 xff0c 到了12月中 xff0c 公司就解散了 xff0c 所
  • 开源自主导航小车MickX4(七)cartographer 室外3D建图

    开源自主导航小车MickX4 xff08 七 xff09 cartographer 室外3D建图 1 cartographer 3D建图demo1 1 cartographer 安装1 2 3D数据集建图1 3 3D定位 2 小车上的3D建
  • FreeRTOS+Trace(04) Xilinx Microblaze平台使用FreeRTOS+Trace

    本章节以 Xilinx Microblaze 平台为例 介绍如何在该目标平台上使用 FreeRTOS Trace 的快照记录功能 所使用的 Xilinx SDK 版本为 2018 2 并在 SDk 中已经创建好了一个目标平台为 Microb
  • Git子模块相关

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 添加子模块 如果项目分的模块比较多 xff0c 而且对每个模块需要独立管理的话 xff0c 子模块就派上用场了 每一个子模块都是一个独立的git仓库 xff0c 有点类似于
  • 更新k8s镜像版本的三种方式

    一 知识准备 更新镜像版本是在k8s日常使用中非常常见的一种操作 xff0c 本文主要介绍更新介绍的三种方法 二 环境准备 组件版本OSUbuntu 18 04 1 LTSdocker18 06 0 ce 三 准备镜像 首先准备2个不同版本
  • LTE中的各种ID含义

    原文链接 xff1a http www hropt com ask q 7128 html ECI 28 Bits 61 eNB ID 20 Bits 43 Cell ID 8 Bits 换成16进制就是ECI共7位 xff0c eNB I
  • 西门子Step7找不到有效授权的解决方法

    1 停止automation license manager service服务 2 删除授权文件 检查你的授权文件夹AX NF ZZ是放在哪个盘 xff0c C盘还是D盘 xff0c 在工具 文件夹选项 查看 选上显示所有文件和文件夹 x
  • AUGULAR安装使用

    先下载并安装NODE js xff0c 里面包含安装完成后已包含NPM NPM应该是augular一个管理工具 https www angular cn docs ts latest guide setup html develop loc
  • 成功不是依靠机会 ---- 参加移动开发者大会大会有感

    这次有幸参加了CSDN和创新工厂主办的移动开发者大会 xff0c 感觉良多 第一印象是 xff1a 这真的是一次技术的大会 我之前参加过很多大会 我特别说的是微软的技术大会 xff0c 已经感受不到什么技术的味道了 xff0c 或者说是这种
  • 基于机器学习的web异常检测

    基于机器学习的web异常检测 Web防火墙是信息安全的第一道防线 随着网络技术的快速更新 xff0c 新的黑客技术也层出不穷 xff0c 为传统规则防火墙带来了挑战 传统web入侵检测技术通过维护规则集对入侵访问进行拦截 一方面 xff0c
  • rosserial_java_ros系统下通过pyserial模块实现串口通讯(Python)

    经过几天的摸索终于实现了 xff1a 在ros系统下 xff0c 订阅Twist cmd vel 消息 xff0c 经过USB转串口通信 xff0c 实现了通过灯带实时反映小车 差速 运行状态的功能 通信部分主要依赖pyserial模块的功
  • 禁止显示Apache目录列表-Indexes FollowSymLinks

    禁止显示Apache目录列表 Indexes FollowSymLinks 如何修改目录的配置以禁止显示 Apache 目录列表 缺省情况下如果你在浏览器输入地址 xff1a http localhost 8080 如果你的文件根目录里有
  • 一个老兵的linux学习和面试经验分享

    特别说明 xff1a 本文为约9个月前老男孩linux培训内部师兄给师弟的经验分享 xff0c 经过该同学同意 xff0c 特此分享给所有博友 学习和面试经验分享 大家好 xff0c 非常高兴能在这里给大家分享学习和面试的经验 xff0c
  • 开源自主导航小车MickX4(八)LeGo-LOAM 室外3D建图

    开源自主导航小车MickX4 xff08 八 xff09 LeGo LOAM 室外3D建图 1 安装 LeGO LOAM1 1安装依赖项 2 运行 LeGO LOAM2 1 运行论文demo2 2 修改配置文件2 3 运行自己的bag包2
  • 微信支付开发中遇到的两个神坑

    微信支付本身是提供了三大Web开发语言的SDK下载的 xff0c 按理说应该很Easy怎么会有坑呢 xff1f 其实坑大多出在文档上 xff0c 文档不完善 xff0c 很多东西都得你去摔一跤才明白 xff0c 事先绝不告诉你 xff0c
  • 实现PC视频播放最强画质教程( Potplayer播放器+MADVR插件)【转】

    转自 xff1a http www hangge com blog cache detail 1461 html 一 MADVR介绍 MADVR 是一款超强的视频插件 xff0c 其配合高清播放软件 xff0c 可以做到目前 PC 上播放高
  • 自动化运维为什么是必须的?

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 运维团队负责最大限度提高效率 降低成本 xff0c 这也意味着他们往往承受着巨大的压力 xff0c 需要解决在不增加员工的情况下 xff0c 最大限度产出价值的问题 达成这
  • 如何理解事件溯源

    在近期举行的PHPDublin见面会上 xff0c 来自DynamicRes的架构师Barry Sullivan被问到 什么是事件溯源 xff0c 作为对这个问题的回答 xff0c 他在博客上写下了这篇文章 xff0c 详细解释了什么是事件