1

官方时间文件谈论当地活动。但是,目前还不是很清楚本地活动的优点或局限性以及如何对其进行编码?

4

1 回答 1

2

根据这篇文章

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

  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);
于 2021-04-01T12:56:04.923 回答