监听多个事件

2024-01-02

如何在事件驱动架构中处理相关事件?具体来说,如果必须触发多个事件才能执行某些操作怎么办?例如,我有一个监听两个事件的微服务foo and bar并且仅当两个事件到达并且具有相同的相关 ID 时才执行操作。

一种方法是在微服务内部保留一个内部数据结构来进行记账,当一切都满足时,就会触发适当的操作。然而,这种方法的问题是微服务不再是不可变的。

有更好的方法吗?


一个典型的例子是销售时收到订单并发布活动。金融和航运都订阅了该事件,但航运也订阅了来自金融的事件。

有趣的是,您不知道消息到达的顺序。销售事件可能会导致技术错误,因为数据库处于脱机状态。它可能会再次排队或最终进入错误队列以供操作重试。与此同时,来自金融的事件可能会到来。所以理论上 销售事件应首先到达,然后是财务事件,但实际上可能相反。

这里有很多解决方案,但我从来不喜欢图形化的解决方案。作为一名 .NET 开发人员,我过去曾使用过 K2 和 Windows Workflow Foundation,但最灵活的解决方案是在代码中创建的,而不是通过图形界面创建的。

我目前会使用 NServiceBus 或 MassTransit 来实现此目的。顺便说一句,我目前在 Pspecial Software 工作,我们开发 NServiceBus。 NServiceBus 有适合此类工作的 Sagas(文档 http://docs.particular.net/nservicebus/sagas/),您还可以在我的博客上阅读有关推介会 http://dennis.bloggingabout.net/2016/03/17/nservicebus-sagas-presentation/,包括。 GitHub 上的代码。

期限saga有点负载,但它基本上处理长时间运行的(业务)流程。格雷戈尔·霍普 (Gregor Hohpe) 称其为Process Manager (link http://www.enterpriseintegrationpatterns.com/patterns/messaging/ProcessManager.html).

总结一下传奇的作用:它们由传入消息实例化并具有状态。传入消息根据关联 ID 绑定/分派到特定的 saga 实例,例如customer id or order id。处理消息(事件)后,状态将被存储,直到新消息到达,或者直到代码将 saga 标记为已完成并将状态从存储中删除。

如前所述,在 .NET 世界中 MassTransit 和 NServiceBus 支持此功能,但在其他环境中很可能有替代方案。

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

监听多个事件 的相关文章

随机推荐

  • “.el”与 JavaScript/HTML/jQuery 有何关系?

    我在谷歌搜索中找不到太多东西 但我可能谷歌搜索了错误的术语 我试图从这里理解 el 中的 el 是什么 http joestelmach github com laconic http joestelmach github com laco
  • 如何使用 Mono.WebBrowser?

    我将此页读了两遍http www mono project com WebBrowser http www mono project com WebBrowser但我不知道如何使用它 没有程序集 我也无法打字using Mono WebBr
  • 默认 nginx client_max_body_size

    我一直收到 nginx 错误 413 Request Entity Too Large 我已经能够更新我的client max body size在我的 nginx conf 文件的服务器部分中将其大小更改为 20M 这已经解决了问题 但是
  • 如何为 postgresql 配置 HikariCP?

    我正在尝试在 postgresql 中使用 HikariCP 但在任何地方都找不到 postgresql 的配置 请给我指出带有 HikariCP 的 postgresql 的任何示例或任何相同的配置教程 我尝试像下面那样使用它 但它不起作
  • 创建docx word文档 web api .net core 2.0

    我正在Asp net core 2 0中开发一个Web API项目 我需要一个库或方法来创建 Word 文档 我搜索了一个尝试过的 NPOI 和 DocX 两者都没有想象中那么好 有人能给我推荐一个工具吗 乍一看 以下链接可以有所帮助 ht
  • 如何在 Go 中使用 RSA 密钥加密和解密纯文本?

    我正在尝试编写一个实用程序 使用 RSA 密钥对加密和解密纯文本文件 RSA 密钥是使用 ssh keygen 生成的 并像往常一样存储在 ssh 中 我无法理解如何使用 Go 语言 crypto 和 crypto rsa 包来做到这一点
  • MySQL 缓存和日期函数

    我曾经在性能博客中读到 最好使用 PHP 的日期函数在 MySQL 查询中设置日期 而不是使用像 curdate 这样的 mysql 日期函数 因为 mysql 可以缓存查询或结果或类似的东西 有人对此有任何见解吗 它有水分还是毫无根据 e
  • R-plotly-结合气泡和等值线图

    我想以情节方式将两种类型的地图组合在一张地图中 即气泡图和分区统计图 目标是通过将鼠标悬停在地图上来显示国家级别 分区统计图 以及城市级别 气泡 的人口规模 分区统计图的绘图示例代码如下 library plotly df lt read
  • 'Room' 类是抽象的;无法实例化

    我有一个抽象类Room它有子类Family and Standard 我创造了room new ArrayList
  • 2 Kubernetes pod 在不知道暴露地址的情况下进行通信

    我计划部署 2 个带有 NodePort 服务的 kubernetes pod 将它们暴露到网络中 现在我希望 pod 1 能够通过他的服务访问 pod 2 问题是我编写部署文件 但我不知道 pod 2 将从集群获取的 IP 地址 但我需要
  • WPF:使用虚拟键盘

    我创建了一个虚拟键盘用户控件 可以在应用程序中跨多个窗口使用 我想知道当按下某个键时如何将其输入到窗口中的文本框中 我正在寻找的是这样的 private void keyboardKey Click object sender Routed
  • Angular2 - 将文本框聚焦于组件加载

    我正在 Angular2 Beta 8 中开发一个组件 该组件有一个文本框和一个下拉列表 我想在组件加载或下拉列表更改事件后立即将焦点设置在文本框中 我如何在 Angular2 中实现这一点 以下是该组件的 Html div div
  • TypeError:使用 tf.map_fn 和 keras 功能模型时无法为

    当我尝试在 keras 功能模型的定义中使用 tf map fn 时 出现错误 TypeError Could not build a TypeSpec for
  • 如何使用 AngularJS 在过滤速度慢时显示某些内容

    在 Angular 中 我有一个表格和一个搜索框 用户可以在其中键入内容 Angular 将在数据中搜索并显示表格 问题是我有足够的数据 过滤可能会减慢 在这种情况下 我想显示一个微调器 类似于我的 html 的示例 Search
  • Delphi 同步滚动组件

    我正在尝试同步 VCL Forms 应用程序中两个 TDBGrid 组件的滚动 但在没有堆栈问题的情况下拦截每个网格组件的 WndProc 时遇到困难 我尝试在滚动事件下发送 WM VSCROLL 消息 但这仍然导致错误的操作 它需要用于单
  • 如何禁用 UIPickerView (Swift)?

    我想禁用 UIPickerView 但将其设置为 isEnabled false 不起作用 不 我不想在使用视图时禁用它 而是无法滚动视图 直到完成某个操作才能重新启用它 我在这里尝试的代码不起作用 它甚至可能不是快速代码 如何禁用 UIP
  • 尝试理解 Ember JS 的承诺

    我一直在尝试编写一个代码示例来理解承诺 但我似乎无法弄清楚如何处理回调并稍后获取 thenable 值 以下是我正在研究的两个相关 JSBin 示例 以冗长的风格编写 以模仿烘焙饼干 没有异步的 Ember JS http jsbin co
  • 如何使用 jQuery 默认预加载所有选项卡

    如果我有 4 个选项卡 其中前 2 个使用 ajax 加载 后 2 个是静态的 那么默认情况下如何预加载 2 个 ajax 选项卡 目前 只有第一个选项卡会自动加载 第二个选项卡会在单击时加载 我希望它们都被加载 这样当我单击第二个时 内容
  • 如何在客户端生成JSON

    在项目中 我必须将复杂的 JSON 命令从服务器发送到客户端 生成 JSONObjects 字符串 数字等 将它们转换为字符串然后通过 RequestBuilder 发送它们是否有效 或者是否有更有效的方法 将 JSON 对象转换为字符串是
  • 监听多个事件

    如何在事件驱动架构中处理相关事件 具体来说 如果必须触发多个事件才能执行某些操作怎么办 例如 我有一个监听两个事件的微服务foo and bar并且仅当两个事件到达并且具有相同的相关 ID 时才执行操作 一种方法是在微服务内部保留一个内部数