官方时间文件谈论当地活动。但是,目前还不是很清楚本地活动的优点或局限性以及如何对其进行编码?
问问题
634 次
1 回答
2
根据这篇文章,
以下是执行单个活动工作流的一系列步骤。
- 启动工作流,将工作流任务添加到工作流任务队列中。
- 工作流任务由收听工作流任务队列的工作流工作者接收。
- 工作流任务通过 ScheduleActivityTask 命令完成。
- 活动任务被添加到活动任务队列中。
- 活动任务由活动工作者接收。
- 活动任务由活动工作者完成。
- 工作流任务被添加到工作流任务队列中。
- 具有活动结果的工作流任务由工作流工作者接收。
- 工作流任务通过 CompleteWorkflowExecution 命令完成。
以下是执行本地活动的一系列步骤。
- 启动工作流,将工作流任务添加到工作流任务队列中。
- 工作流任务由收听工作流任务队列的工作流工作者接收。
- 工作流将本地活动任务安排到进行中的本地活动任务队列中。
- 本地活动由侦听进程内本地活动任务队列的本地活动工作者执行。
- 本地活动任务完成后返回工作流。
- 工作流任务通过 RecordMarker 和
CompleteWorkflowExecution
命令完成。标记命令包含本地活动执行的结果。
本地活动的限制是:
- 它仅适用于不超过工作流任务超时的短期活动。这意味着本地活动不支持心跳。
- 对于长时间重试来说效率不高。正常活动几乎可以无限期地重试。
- 本地活动至少具有一次语义,因为工作流任务的失败将导致它们重新执行。
- 本地活动扩展了工作流任务的执行。在任务运行时,它无法对信号做出反应。因此它增加了信号处理的延迟。
@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 回答