时间:何时以及如何使用本地 activity?

Temporal: When and how to use the local activity?

官方时间文档谈到 local activities。然而,目前还不是很清楚本地活动的优势或局限性以及如何对其进行编码?

根据this post

这是执行单个 activity 工作流的一系列步骤。

  1. 工作流已启动,将工作流任务添加到工作流任务中 排队。
  2. 工作流任务由监听 工作流任务队列。
  3. 工作流任务已使用 ScheduleActivityTask 命令完成。
  4. activity 任务已添加到 activity 任务队列。
  5. activity 任务由 activity 工作人员接收。
  6. activity 任务由 activity 工作人员完成。
  7. 工作流任务已添加到工作流任务队列。
  8. 具有 activity 结果的工作流任务由 工作流工作者。
  9. 工作流任务已通过 CompleteWorkflowExecution 完成 命令。

这是执行本地 activity.

的一系列步骤
  1. 工作流已启动,将工作流任务添加到工作流任务中 排队。
  2. 工作流任务由监听 工作流任务队列。
  3. 工作流将本地 activity 任务安排到进程中的本地 activity 任务队列。
  4. 本地 activity 由监听的本地 activity worker 执行 到进程内本地 activity 任务队列。
  5. 本地activity任务完成返回工作流。
  6. 工作流任务已使用 RecordMarker 完成,并且 CompleteWorkflowExecution 命令。标记命令包含 本地 activity 执行的结果。

本地活动的限制是:

  1. 它只适用于不超过工作流程的短期活动 任务超时。这意味着不支持心跳 本地活动。
  2. 长时间重试效率不高。正常活动可以 几乎无限期地重试。
  3. 本地 activity 至少有一次语义是工作流失败 任务将导致它们重新执行。
  4. 本地activity 扩展工作流任务执行。虽然任务是 运行 它无法对信号做出反应。所以它增加了延迟 信号处理。

来自@maxim

的警告

We’ve seen multiple cases when use of local activities without understanding their limitations caused various production issues. So my advice is to stick to normal activities unless your use case requires very high throughput and large activity fan outs of very short activities.

代码示例java-sdk:

  private final RetryOptions retryOptions = RetryOptions.newBuilder()
          .setInitialInterval(Duration.ofSeconds(1))
          .setMaximumInterval(Duration.ofSeconds(10))
          .setBackoffCoefficient(2.0)
          .setMaximumAttempts(3)
          .build();

  private final LocalActivityOptions laOptions =
          LocalActivityOptions.newBuilder()
                  .setRetryOptions(retryOptions)
                  .setStartToCloseTimeout(Duration.ofSeconds(10))
                  .build();

  private final Account acc = Workflow.newLocalActivityStub(Account.class, laOptions);