【问题标题】:How does history replay works in cadence?历史回放如何以节奏进行?
【发布时间】:2021-05-18 01:20:29
【问题描述】:

历史回放如何按节奏进行?

我有一个按顺序调用两个活动的工作流。

比如说,第一个活动已经完成,第二个活动有 100 行代码。如果应用服务器在执行activity2中的第50行代码时重新启动,它是否正好从第50行开始执行。如果是,cadence 内部发生了什么神奇的事情?

@Override
    public String composeGreeting(String greeting, String name) throws Exception {
      FileWriter fw =
          new FileWriter(
              "/Users/kumble-004/Documents/Uber_Cadence/Sample_Projects/TestCadence/src/com/company/"+name+".txt");

      System.out.println(
          DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss").format(LocalDateTime.now())
              + " [Activity] started");

      long time = System.currentTimeMillis() + 240000;
      int i = 0, j=1;

      while (System.currentTimeMillis() != time) {
        if(i++ %10000000 == 0) {
          fw.write("print - " + j++ + " " +
                  DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss").format(LocalDateTime.now()) +"\n");
        }
      }
      fw.close();
      System.out.println(
          DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss").format(LocalDateTime.now())
              + " [Activity] ended");

      return greeting + " " + name + "!";
    }
  }

我的 hello 活动中有上述代码。此代码将运行 4 分钟,当条件满足时,它将在文件中写入数据

我在打印[Activity] started 后启动了工作流程并退出了 cadence 服务器。我没有启动它只是停止它。但 4 分钟后,它会在控制台中准确打印 [Activity] Ended。我想知道这怎么可能,因为我停止了服务器但代码正在执行,数据正在写入文件中。

当我通过 cadence UI 检查它时,它显示最后的历史是 ActivityTaskStarted。我启动了我的服务器。 15 分钟后(因为 scheduleToCloseTimeoutSeconds 是 15 分钟)活动返回事件 ActivityTaskTimedOut 并且整个 whorkflow 由于此超时而失败。

请解释一下重启 cadence 服务器时发生了什么?

【问题讨论】:

    标签: cadence-workflow cadence uber-cadence


    【解决方案1】:

    如果在activity2中执行第50行代码时app server重启了,是不是正好从第50行开始执行

    不,它不会自动为您从第 50 行活动恢复。

    重播只发生在工作流中。它正在中继历史以重播和重建内存堆栈。工作流中发生的一切都存储在历史记录中:

    • 工作流代码中的每一步都会生成一堆结果,称为“决策”
    • 活动/子工作流结果
    • 信号等外部事件
    • 定时器

    更多详情请参考the doc about replay historyWhat exactly is a Cadence decision task?

    但 4 分钟后,它正在控制台中准确打印 [Activity] Ended。我想知道这怎么可能,因为我停止了服务器但代码正在执行,数据正在写入文件中。

    那是因为您的活动工作者仍在运行。您正在运行的代码是纯粹的活动代码。

    但是,当服务器关闭时,它的活动结果将无法报告给服务器。这意味着历史记录会丢失,并且工作流可能会重新安排另一个活动(如果启用了重试)。

    请参考the doc about activity timeout and retry

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-03
      • 1970-01-01
      • 2011-04-27
      • 2012-10-28
      相关资源
      最近更新 更多