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

问题描述

历史回放如何按节奏工作?

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

比如说,第一个活动完成了,第二个活动有 100 行代码。如果在activity2中执行第50行代码时app server重启,是不是正好从第50行开始执行。如果是,那么节奏中发生了什么神奇的事情?

@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服务器时发生了什么?

解决方法

如果应用服务器在activity2中执行第50行代码时重启,是否正好从第50行开始执行

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

重放只发生在工作流中。它依靠 History 来重放和重建内存堆栈。工作流中发生的一切都存储在历史记录中:

  • 工作流代码中的每一步,都会生成一堆名为“决策”的结果
  • Activity/ChildWorkflow 结果
  • 外部事件,如信号
  • 计时器

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

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

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

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

请参考the doc about activity timeout and retry