Axon Framework:Saga 项目,具有两个或三个微服务之间的补偿事件

2024-03-18

我有一个关于 Axon Saga 的问题。我有一个项目,其中有三个微服务,每个微服务都有自己的数据库,但是两个“从属”微服务必须将其数据共享给“主”微服务,为此我想使用 Axon Saga。我已经问过关于赔偿的问题,出了问题,我必须自己处理赔偿,还可以,但不太理想。目前我正在使用 DistributedCommandBus 在微服务之间进行通信,这有好处吗?我正在使用 Choreography Saga 模型,所以它现在的样子是这样的:

  1. 主站 -> 发送命令 -> 从站1 -> 处理事件
  2. Slave1 -> 发回命令 -> Master -> 处理事件
  3. Master -> 发送命令 -> Slave2 -> 处理事件
  4. Slave2 -> 发回命令 -> Master -> 处理事件

如果出现问题,则会向后补偿命令/事件。

我的问题是,是否有人对 Axon 做过类似的事情,并有补偿,最佳做法是什么?我如何重试 Saga 进程?使用重试调度程序?如果可以的话添加一个 github 存储库。

谢了哥们


首先,让我回答你的主要问题:

我的问题是有人对 Axon 做过类似的事情吗?

很快,是的,因为这是 Sagas 的主要用例之一。 根据经验,我想说 Saga 可用于协调复杂的商业交易之间:

  1. 几个不同的聚合实例
  2. 几种限界上下文

从表面上看,您似乎已经选择了委托复杂业务交易的第二种选择。

需要注意的是,当你使用 Sagas 时,你应该非常有意识地处理any异常和/或命令调度结果。

因此,如果您从“Master”向“Slave 1”发送命令,而后者操作失败,则会出现以下结果将会回来进入佐贺。 因此,这为您提供了重试操作的第一个选项,我建议使用补偿动作。 最后,通过补偿操作,我正在讨论发送命令来触发它。

如果您不能依赖调度命令的直接响应,那么在 Saga 中重试/重新安排消息将是合理的第二个选择。

为此,Axon 拥有EventScheduler and DeadlineManager。 请注意,两者中的前者发布了一个事件给大家看。 后者安排了DeadlineMessage在单个 Saga 实例的上下文中,从而限制了谁可以看到正在发生重试的范围。

通常,DeadlineManager因此,这将是我的首选操作模式,除非您要求每个人都看到这种“重新安排行动”。 仅供参考,检查this https://docs.axoniq.io/reference-guide/implementing-domain-logic/complex-business-transactions/deadline-handling页面为EventScheduler信息与this https://docs.axoniq.io/reference-guide/configuring-infrastructure-components/deadlines页面为DeadlineManager info.

示例更新

下面是一些伪代码,可以让您了解 Saga 事件处理程序中的补偿操作是什么样子的:

class SomeSaga {

    private CommandGateway commandGateway;

    @SagaEventHandler(assocationValue = "some-key")
    public void on(SomeEvent event) {
        // perform some checks, validation and state setting, if necessary
        commandGateway.send(new MyActionCommand(...))
                      .exceptionally(throwable -> {
                                         commandGateway.send(new CompensatingAction(...));
                                     });
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Axon Framework:Saga 项目,具有两个或三个微服务之间的补偿事件 的相关文章

随机推荐

  • 如何使用XHTML/HTML给网站添加站内搜索功能? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我真的很想学习如何为我的网站制作自己的搜索引擎 我有定义的按钮和标签 但它不搜索 我无法弄清楚用于实际搜索该网站的 HTML 或 XHTM
  • 杰克逊 FAIL_ON_UNKNOWN_PROPERTIES 为 false 不起作用

    我正在尝试使 jackason 的 thrift 反序列化向后兼容 ObjectMapper mapper getObjectMapper false pretty mapper configure DeserializationFeatu
  • 将opentok视频会议集成到parse.com + iOS应用程序中

    这个问题不仅针对代码 还针对我的应用程序设计 我有一个 iPhone 应用程序 需要 opentok 来处理视频 音频会话 我已经经历过基本样品 http www tokbox com opentok ios docs index html
  • 在 iOS 上禁用全屏自动播放

    我遇到的唯一问题是 根据苹果文档 我无法禁用全屏播放视频 这是默认启用的 需要设置如下 webView configuration allowsInlineMediaPlayback true 这是基于我的理解它应该是怎样的 然而 这不起作
  • 是否可以在 DOM 中移动

    我想创建一个
  • 在Scheme中编写一个自动记忆器。有关宏和包装器的帮助

    我在Scheme中编写自动记忆器时遇到了一些问题 我有一个有效的 memoize 函数 它创建一个哈希表并检查该值是否已经计算出来 如果之前已经计算过 则返回值 否则调用该函数 define memoizer fun let a table
  • 如何决定创建受检异常或非受检异常[重复]

    这个问题在这里已经有答案了 我想知道如何知道创建并抛出已检查异常或未检查异常 例如 我有一项服务 它会获取一些数据并在使用之前对其进行验证 在验证过程中 某个字段不符合规则 我想抛出一个异常 比如 ValidationException 我
  • gapi.client.load 与 google.load

    我对如何正确加载 Google 的 API 感到困惑 我看到提到了两种不同的方法 First 谷歌 API 加载器 https developers google com loader https developers google com
  • 以 RESTful 方式调用资源上的服务器端方法

    请记住 我对 REST 有初步的了解 假设我有这个网址 http api animals com v1 dogs 1 现在 我想让服务器让狗叫 只有服务器知道如何执行此操作 假设我想让它在 CRON 作业上运行 让狗在接下来的时间里每 10
  • 如何禁用java中的运行时警告?

    我在 java 程序中使用 jar 文件 它在运行时生成警告 但我不希望我的客户看到这些警告 我怎样才能禁用这些警告 警告如下 Sep 25 2009 10 10 33 PM com gargoylesoftware htmlunit In
  • 如何列出 Cassandra 中所有可用的键空间?

    我是 Cassandra 的新手 正在尝试使用 Cassandra 实现一个玩具应用程序 我在 Cassandra 数据库中创建了一个键空间和几个列族 但我忘记了集群的名称 我试图查找是否有任何查询可以列出所有可用的键空间 有人知道这样的查
  • 将 asp.net、C# GridView 输出到 PDF 的好方法是什么

    我尝试使用 Microsoft ReportingControls 但发现它们过于麻烦 而且文档太少 我想要一个简单的控件 可以将 GridView 控件转换为 PDF 文档 我已经开始研究 PDFSHArp 但在文档方面遇到了死胡同 iT
  • HTML Canvas 上的图像无法下载

    我有 HTML 画布 它可以很好地显示图像 我有这个 jquery 代码来下载图像 img download click function var data canvas toDataURL download href data I tri
  • wmode=透明 Youtube 视频 Iframe 无法在带有引导模式的 IE 中工作

    我有一个网络应用程序 我使用 iframe 标签嵌入 Youtube 视频 我也在使用引导模式 因此 当引导模式无法与 YouTube 视频重叠时 IE 中就会出现问题 现在我用谷歌搜索这个问题 发现很多答案都说添加 wmode trans
  • 如何使用 std::atomic<>

    我有一个类 我想在不同的线程中使用 我想我可以使用std atomic这边走 class A int x public A x 0 void Add x void Sub x 在我的代码中 std atomic a a 并在不同的线程中 a
  • Amazon API 提交请求太快

    我正在创建一个游戏比较网站 并希望将亚马逊价格包含在其中 我面临的问题是使用他们的 API 来获取我已有的 25 000 种产品的价格 我目前正在使用 Amazons API 中的 ItemLookup 并让它能够检索价格 但是在大约 10
  • jQuery 对scrollTop() 的响应缓慢

    我一直在尝试制作调整高度导航 如下所示 http www kriesi at themes enfold http www kriesi at themes enfold 正如在 jsfiddle 上看到的那样 我已经非常接近了 http
  • 无法找到 zlibwapi.dll。请确保它在您的库路径中

    我正在开发一个对象检测项目 并希望使用我的 GPU 处理该项目 我已经完成了NVIDIA 设置教程 https medium com analytics vidhya build opencv from source with cuda f
  • 我无法通过 BashOperator xcom_push 参数

    我是 Airflow 的 xcom 功能的新手 我用 PythonOperator 尝试了它 它工作得很好 即 我可以从上下文中推送和提取值 但是当我在 BashOperator 上尝试它时 它不起作用 但是 我可以通过在任务创建期间添加
  • Axon Framework:Saga 项目,具有两个或三个微服务之间的补偿事件

    我有一个关于 Axon Saga 的问题 我有一个项目 其中有三个微服务 每个微服务都有自己的数据库 但是两个 从属 微服务必须将其数据共享给 主 微服务 为此我想使用 Axon Saga 我已经问过关于赔偿的问题 出了问题 我必须自己处理