事件驱动架构和事件结构

2024-02-17

我是 EDA 新手,我已经阅读了很多有关其优点的内容,并且可能有兴趣在我的下一个项目中应用它,但仍然不明白一些东西。

引发事件时,哪种模式最适合:

  1. 将事件命名为“CustomerUpdate”并包含有关客户的所有信息(更新或未更新)
  2. 将事件命名为“CustomerUpdate”并仅包含真正更新的信息
  3. 将事件命名为“CustomerUpdate”并包含最少的信息(标识符)和/或 URI,以便消费者检索有关该客户的信息。

我问这个问题是因为我们的一些活动可能会很繁重且频繁。

感谢您的回答和时间。


将事件命名为“CustomerUpdate”

首先让我们从您的活动名称开始。事件的目的是描述某事物已经发生了。这与命令不同,命令是针对某事发出指令尚未发生.

您的事件名称“CustomerUpdate”在这方面听起来不明确,因为它可能描述过去或将来的事情。

客户更新会更好,但即便如此,Updated是另一个含糊不清的术语,并且在业务环境中并不特定。为什么在这种情况下要更新客户?是因为他们更改了付款详细信息吗?搬回家了?他们的身份是否从白银升级为黄金?事件可以根据需要变得具体。

乍一看这似乎是想太多了,但是当您从事件负载中删除数据和上下文时,事件命名变得尤其重要,更多地朝着skinny事件(您的问题中的“选项3”,我将在下面讨论)。

这并不是说在这种粒度级别上定义事件总是合适的,只是说它是在项目早期向您开放的一条途径,可能会在以后带来红利(或者可能会用数千个事件淹没您)类型)。

回到您的实际问题,让我们依次考虑您的每个选项:

将事件命名为“CustomerUpdate”并包含所有信息(更新 或不)关于客户

我们称这个“模式”为Fat信息。

胖消息(也称为快照)表示所描述实体在给定时间点的状态以及有效负载中存在的所有事件上下文。它们很有趣,因为消息本身代表了服务和消费者之间的契约。它们可用于在业务域之间传达状态变化,其中可能优选所有事件上下文在消费者处理消息期间都存在。

优点:

  • 自我一致——完全可以在不了解其他系统的情况下使用。
  • 易于使用(更新插入)。

缺点:

  • 脆弱——服务和消费者之间的契约与消息本身耦合。
  • 如果消息以错误的顺序到达,则很容易用旧数据覆盖当前数据(提示:您可以通过使用事件溯源 https://martinfowler.com/eaaDev/EventSourcing.html图案)
  • Large.

将事件命名为“CustomerUpdate”并仅包含已更新的信息 真的更新了

我们称这种模式为Delta信息。

增量消息在很多方面与胖消息相似,尽管它们的生成和使用通常更复杂。一个很好的例子是JSON补丁 https://www.rfc-editor.org/rfc/rfc6902标准。

因为它们只是事件实体的部分描述,所以增量还带有一个内置假设,即消费者了解所描述的事件的一些信息。因此,它们可能不太适合在业务域之外发送,因为在业务域中事件实体可能并不为人所知。

当在共享相同实体模型的系统之间同步数据时,增量真正发挥作用,理想情况下保留在非关系存储(例如,no-sql)中。在这种情况下,可以检索实体,应用增量,然后以最小的努力再次持久化。

优点:

  • 小于 Fat 消息
  • 在涉及共享实体模型的用例中表现出色
  • 可移植(如果基于 jsonpatch 等标准,或者在较小程度上基于 diffgram)

缺点:

  • 与 Fat 消息类似,假设完全了解数据实体。
  • 轻松用旧数据覆盖当前数据。
  • 生成和使用很复杂(特定用例除外)

将事件命名为“CustomerUpdate”并包含最少的信息 (标识符)和/或让消费者检索信息的 URI 关于该客户。

我们称其为Skinny信息。

瘦消息与您定义的其他消息模式不同,因为服务/消费者契约不再在消息中明确显示,而是暗示消费者稍后将检索事件上下文。这将合约和消息交换解耦,这是一件好事。

这可能适合也可能不适合跨业务领域的事件通信,具体取决于您的企业的设置方式。由于事件有效负载非常小(通常是带有一些标头的 ID),因此除了事件名称之外,没有任何上下文可以供使用者做出处理决策的基础;因此,确保事件被正确命名变得更加重要,特别是当消费者可以通过多种方式处理事件时客户更新信息。

此外,在事件数据中包含实际资源地址可能不是一个好习惯 - 因为事件是已经发生的事情,事件消息通常是不可变的,因此事件中的任何信息都应该永远真实,以防事件需要被更改。重播了。在这种情况下,资源地址很容易变得过时,并且事件将无法重播。

优点:

  • 将服务契约与消息解耦。
  • 事件名称中包含有关该事件的信息。
  • 自然幂等(带有时间戳)。
  • 一般都比较小。
  • 易于生成和使用。

缺点:

  • 消费者必须进行额外的调用来检索事件上下文 - 需要对其他系统的明确了解。
  • 事件上下文在消费者检索它时可能已经过时,使得这种方法通常不适合某些实时应用程序。

发起事件时,哪种模式最适合?

我认为这个问题的答案是:这取决于很多因素,而且可能没有一个正确的答案。

评论更新:也值得一读,一篇关于消息传递的非常古老、经典的博客文章:https://learn.microsoft.com/en-gb/archive/blogs/nickmalik/killing-the-command-message-should-we-use-events-or-documents https://learn.microsoft.com/en-gb/archive/blogs/nickmalik/killing-the-command-message-should-we-use-events-or-documents(也在这里:http://vanguardea.com/killing-the-command-message-should-we-use-events-or-documents/ http://vanguardea.com/killing-the-command-message-should-we-use-events-or-documents/)

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

事件驱动架构和事件结构 的相关文章

  • 覆盖骨干模型更改事件

    我认为我想做的事情很简单 我只是不知道该怎么做 当我的模型属性之一发生更改以便将一些数据传递给事件处理程序时 无论更改是值的增加还是减少 我想触发我自己的事件 基本上我希望我的处理程序在视图中执行此操作 handler function i
  • Android:如何创建MotionEvent?

    MotionEvent没有获取构造函数 我想在单元测试中手动创建MotionEvent 那么如何获取它 谢谢 您应该使用静态之一obtain的方法MotionEvent类来创建一个新事件 最简单的方法 除了从现有事件包装新事件之外 是 st
  • 如何在不实际调整大小的情况下触发 Control.Resize 事件?

    我不会对控件进行子类化 尝试通过触发事件Control Size Control Size失败 因为即使新大小实际上不同 它也不会触发 如果您要子类化Control 你可以打电话OnResize直接 或者将其暴露在 API 上 public
  • socket.io:未触发断开连接事件

    我做了一个简单的实时访客计数器 您可以从以下位置下载 这个存储库 https bitbucket org bitliner nodejs mycounter 发生的情况是服务器上的断开连接事件 即使在浏览器关闭后 永远不会被触发 serve
  • 是否可以模拟 isTrusted=true

    我希望在调用 touchStart 事件时能够模拟 isTrusted true 是否有任何库或任何类型的解决方法可以实现这一点 以下是我以编程方式运行 touchStart 时的输出与实际调用 touchStart 时的输出 我正在使用移
  • ASP.NET 列表视图->单击行->执行操作

    我需要以下方面的帮助 我有一个用隐藏代码填充的列表视图 Linq gt Sql ListView1 DataSource from x in database ITEMS select x ListView1 DataBind 项目内容 I
  • 如何在alert()之后给予focus()?

    我有类似的东西
  • 插件架构中的反射与属性

    我正在开发一个在启动时从子目录加载插件的应用程序 目前我正在通过使用反射来迭代每个程序集的类型并查找实现 IPluginModule 接口的公共类来实现此目的 由于反射涉及性能影响 并且我预计一段时间后会有多个插件 我想知道定义在程序集级别
  • 这叫什么类型的建筑?

    对于我当前正在开发的 Web 应用程序 ASP NET MVC 我们采用以下架构 Data Access Layer 将数据持久保存到任意数据库的逻辑 Domain 数据模型 Service Layer 业务逻辑 例如订单处理 账户管理等
  • 是否有用于序列化和反序列化各种格式的对象层次结构的模式?

    给定一个复杂的对象层次结构 幸运的是它不包含循环引用 如何实现支持各种格式的序列化 我不是来讨论实际实施的 相反 我正在寻找可能派上用场的设计模式的提示 更准确地说 我正在使用 Ruby 我想解析 XML 和 JSON 数据以构建复杂的对象
  • 在没有事件的情况下从 HTML 执行 javascript 函数

    我希望从 HTML 页面调用 javascript 函数 并且我do not希望它依赖于任何事件 该函数位于单独的 js 文件中 因为我希望在许多网页中使用它 我也将变量传递给它 我试过这个 HTML fp footer2 js中的函数 f
  • socket.io 广播功能 & Redis pub/sub 架构

    如果有人能帮助我解决一个小疑问 我将不胜感激 使用socket io广播功能和在Redis上使用pub sub设计架构有什么区别 例如 在另一个示例中 node js 服务器正在侦听 socket io 针对 键 模型 todo 和值 数据
  • Excel UserForm 动态 TextBox 控件退出事件

    UPDATE 经过对对象浏览器的进一步研究 看来MSForms TextBox既没有实现 Name财产或 Exit事件 仅 Change事件 有没有办法确定具体是哪个TextBox生成更改事件 或者可以使用MSForms Control用这
  • Mac 监听事件:复制到粘贴板

    我正在阅读 NSPasteboard 然后想找到 我试图找到正确的通知方法来侦听数据复制到剪贴板的事件 我还试图找到复制到剪贴板的数据的文件路径 这将是一个粘贴板对象 如果我从浏览器中的页面复制文本 我会尝试找出如何获取复制文本的页面的 U
  • 目标操作 uicontrol 事件

    我一定在这里遗漏了一些明显的东西 但是 UIControl有一个方法 void addTarget id target action SEL action forControlEvents UIControlEvents controlEv
  • Android Wear Overlay 传递触摸事件

    我有一个 Android Wear 应用程序 其中我使用透明的覆盖视图来接收触摸事件 我需要能够接收屏幕上任何位置发生的所有触摸事件 并且还能够看到它们的坐标 我发现的所有研究都表明我无法接收所有触摸事件并将其传递 然而 and 都在做这样
  • 您的 Web 服务版本控制最佳实践是什么?

    我们有 2 个独立的产品 需要通过 Web 服务相互通信 支持 API 版本控制的最佳实践是什么 I have 本文 http www ibm com developerworks webservices library ws versio
  • WiFi 网络变化是否有 NSNotificationCenter 通知?

    我想在我的 Cocoa 应用程序中订阅 WiFi 网络更改 但我无法找到合适的事件来订阅 WiFi 网络变化是否有 NSNotificationCenter 通知 据我所知 我会用CoreWLAN https developer apple
  • Web 组件 - 服务/非 html 组件

    所以我来自 Angular 想看看如何创建vanilla Web components 现在 从 Angular 开始 我们倾向于将事物分开 组件 充当 HTML CSS 和一些 javascript 然后是 服务 主要负责收集数据和执行不
  • 如何通过减少请求来改进 AJAX 实时搜索

    我正在构建一个 AJAX 实时搜索页面 到目前为止 一切都按预期运行 但我注意到我正在进行大量的 AJAX 调用 我知道发生这种情况的地点和原因 但我找不到阻止这些 AJAX 调用发生的方法 我将尝试给出快速解释 然后粘贴下面的代码 在页面

随机推荐

  • 如何检测iPad用户点击键盘隐藏按钮?

    在我的应用程序中 我有一些围绕键盘隐藏和显示的复杂逻辑 我有兴趣检测用户 拥有 iPad 何时专门点击 iPad 键盘隐藏按钮 I am not仅当用户实际点击此按钮时 才有兴趣检测键盘何时应该隐藏 有什么建议么 谢谢你 我一直在寻找完全相
  • 运行 ansible playbook 时如何缩小范围?

    我有一个剧本需要花费很多时间来执行 部分原因是它必须在很多节点上运行 我在 ansible 检查所有节点的状态上浪费了时间 并且我需要做一些中间某个地方发生了变化 缩小剧本范围的最佳方式是什么 我考虑过隔离所需的更改和 或仅在单个节点上运行
  • 使用 Cucumber 测试 EventMachine

    我正在尝试为我的应用程序编写一个黄瓜功能和 rspec 测试 以使用 twitter stream 访问 twitter 流 api 我有以下代码 Then I should see the latest d tweets from my
  • Spark Metrics:如何访问执行器和工作器数据?

    注意 我在 YARN 上使用 Spark 我一直在尝试公制 https spark apache org docs latest monitoring html metrics在 Spark 中实现 我启用了 ConsoleSink 和 C
  • .NET 相当于 Java 有界通配符 (IInterf)?

    我一直在尝试将一些使用 有界 通配符泛型的 Java 代码转换为 C 我的问题是 Java 似乎允许泛型类型与通配符一起使用时既可以是协变的 也可以是逆变的 这是前作的衍生作品question https stackoverflow com
  • .NET 中的大型 Gen 0 堆,浪费内存?

    我有一个使用大量内存的 ASP NET C Web 应用程序 ANTS Memory Profiler 和 PerfMon 都显示我的 Gen 0 堆在 Application Start 期间快速增长到大约 1 GB 我读here htt
  • Postgres >= 和 <= 带有特殊字符的行为

    我正在尝试使用 geohash 手动方式 因为我无法使用 postgres gis 的 geo 方法 因为我正在使用的框架 为此 我在 postgres 中有一个专栏 geoHash text default text not null 来
  • AG-Grid:根据服务器的响应制作可编辑的列

    我需要一些工作帮助 故事是这样的 如果 Item Id null 我需要使 日期 列可编辑 我们有一个 视图 其中有一个使用 AG Grid 创建的收件箱 收件箱看起来像这样 Item Id Date Justification 24 05
  • 减少张量流中的矩阵数组

    功能类似于tf reduce mean https www tensorflow org api docs python tf reduce mean and tf reduce prod https www tensorflow org
  • 如何使用Eclipse数据库管理视角连接MySql 8.0数据库

    我想使用 Eclipse 数据库工具连接到本地 MySql 8 0 数据库 但是在设置新的数据库连接配置文件时 我找不到 MySql 8 0 的驱动程序模板 该列表仅包含直至 MySql JDBC Driver 5 1 的模板配置文件 那么
  • 使用 UIDocumentInteractionController 预览文档在 iOS 13 中不起作用

    我使用 UIDocumentInteractionController 来预览应用程序中不同类型的文件 这在过去工作得很好 但是当在 iOS 13 的设备上运行该应用程序时 不会显示该文档 显示的是文件名和类型 我寻找过类似的问题并发现了这
  • WPF 应用程序的命名空间中不存在该名称

    使用 VS2017 创建 WPF 应用程序 我有一个像这样的枚举 namespace Sample Common public enum SmPageTypes Type1 0 Type2 1 我尝试以 xaml 形式使用它 但出现错误 命
  • Android:应用程序兼容主题 - 较大时的对话框

    我想使用 AppCompat 库 但是没有 Dialog 主题 也没有我可以扩展或使用的 DialogWhenLarge 主题 有没有办法可以扩展基本主题并将其设为 DialogWhenLarge 可能使用文件夹和自定义样式项 Thanks
  • 测试与 Jasmine 异步的 requireJS 方法

    我正在尝试测试需要使用模块的功能jasmine and 要求 这是一个虚拟代码 define testModule function return 123 var test function require testModule funct
  • 如何从 AngularJS 中的多级指令获取控制器范围(没有 $parent)

    如何从以下结构中的多级指令访问控制器范围 我创建了一个内部具有多级作用域的指令 1 Controller scope 1 2 Directive1 scope main directive 1 2 1 Directive2 scope 1
  • 如何比较类和接口?

    谁能解释一下如何比较KClasses 和它们之间的接口 我知道如何检查类或接口是否相等 但我不明白如何检查 A 类是否是 B 类的超类等 interface IB interface IC IB open class A open clas
  • iPhone的加速度计可以在后台运行吗?

    我想使用iPhone的加速度计来获取加速度计值的日志文件 可能是24小时 当其他应用程序运行时 是否可以让加速度计在后台运行 如果您的应用程序因其他原因被允许在后台运行 您现在就可以执行此操作 查看核心运动 APIstartAccelero
  • 跟踪用户在网站中完成特定操作的时间

    我想跟踪用户完成特定操作所花费的时间 包括服务器响应时间和渲染时间 DOM相关更改 在网站中 我已经在 Angular 框架中尝试过了 为此 我想记录用户开始操作的时间 并且我想记下操作完成的时间 作为一名开发人员 我会知道用户何时开始活动
  • laravel 在控制器中的所有方法之间共享变量

    我正在 PHP laravel 框架中制作一个简单的网站 其中顶部导航链接是从数据库动态生成的 我正在主控制器操作中生成 pages 变量并传递到布局文件 我的代码如下 public function home pages Page all
  • 事件驱动架构和事件结构

    我是 EDA 新手 我已经阅读了很多有关其优点的内容 并且可能有兴趣在我的下一个项目中应用它 但仍然不明白一些东西 引发事件时 哪种模式最适合 将事件命名为 CustomerUpdate 并包含有关客户的所有信息 更新或未更新 将事件命名为