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

问题描述

官方临时文档讨论了 local activities。但是目前还不是很清楚本地活动有哪些优点或局限性以及如何对其进行编码?

解决方法

根据this post

以下是执行单个活动工作流的一系列步骤。

  1. 工作流已启动,将工作流任务添加到工作流任务中 队列。
  2. 工作流工作线程接收到工作流任务 工作流任务队列。
  3. 工作流任务通过 ScheduleActivityTask 命令完成。
  4. 一个活动任务被添加到活动任务队列中。
  5. 活动任务由活动工作人员接收。
  6. 活动任务由活动工作人员完成。
  7. 工作流任务被添加到工作流任务队列中。
  8. 具有活动结果的工作流任务由 工作流工作者。
  9. 工作流任务通过 CompleteWorkflowExecution 完成 命令。

以下是执行本地活动的一系列步骤。

  1. 工作流已启动,将工作流任务添加到工作流任务中 队列。
  2. 工作流工作线程接收到工作流任务 工作流任务队列。
  3. 工作流将本地活动任务安排到进程内本地 活动任务队列。
  4. 本地活动由监听的本地活动工作者执行 到进程内本地活动任务队列。
  5. 本地活动任务完成返回工作流。
  6. 工作流任务通过 RecordMarker 和 CompleteWorkflowExecution 命令。标记命令包含 本地活动执行的结果。

本地活动的局限性是:

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

来自@maxim

的警告

我们已经看到了多个使用本地活动而没有 了解它们的局限性导致了各种生产问题。所以 我的建议是坚持正常活动,除非您的用例 需要非常高的吞吐量和非常大的活动扇出 短期活动。

代码示例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);