历史重播如何以节奏进行?

How does history replay works in cadence?

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

我有一个顺序调用两个 activity 的工作流程。

说,第一个 activity 完成了,第二个有 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里有上面的代码activity。此代码将 运行 持续 4 分钟,当条件满足时它将在文件中写入数据

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

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

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

If the app server restarts when executing the 50th line of the code in activity2, is it exactly starts the execution from the 50th line

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

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

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

详情请参考the doc about replay history and What exactly is a Cadence decision task?

But after 4 minutes it is exactly printing [Activity] Ended in the console. I am wondering how is this possible because I stop the server but code is executing, data is writtening in file.

那是因为你的 activity 工人还在 运行。你的代码运行纯粹是activity代码。

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

请参考the doc about activity timeout and retry