4.3 - Continue-As-New
Continue-As-New 是什么?
Continue-As-New 支持成功关闭工作流执行,同时创建新工作流执行。可以将其视为工作流执行时间过长或接近某些扩展限制时的检查点。
新工作流执行位于同一链中;保留相同的工作流 ID,但获得新运行 ID 和全新事件历史。同样接收工作流的参数。
如何使用 Python SDK Continue-As-New?
首先,合理设计工作流参数,以便通过 Continue-As-New 进入下个工作流运行时,能传入“当前状态”。对于工作流的原始调用者而言,该状态通常设置为 None。
@dataclass
class ClusterManagerInput:
state: Optional[ClusterManagerState] = None
test_continue_as_new: bool = False
@workflow.run
async def run(self, input: ClusterManagerInput) -> ClusterManagerResult:上述代码片段中的测试钩子将在下文介绍。
在工作流内部,使用相同的类型调用 continue_as_new() 函数。这将立即停止当前工作流,启动新工作流。
workflow.continue_as_new(
ClusterManagerInput(
state=self.state,
test_continue_as_new=input.test_continue_as_new,
)
)包含消息处理器的工作流注意事项
如果使用更新或信号,那么不要在处理器中调用 Continue-As-New。相反,应在主工作流中等待处理器完成后,再执行 continue_as_new。请参阅 all_handlers_finished 示例。
何时适合使用 Python SDK 执行 Continue-As-New?
当工作流可能遇到性能下降或事件历史限制时,应使用 Continue-As-New。
Temporal 根据这些限制追踪工作流的进度,以便让开发者知道何时应执行 Continue-As-New。调用 workflow.info().is_continue_as_new_suggested() 检查是否已到该时机。
如何使用 Python SDK 测试 Continue-As-New?
对执行 Continue-As-New 的工作流进行测试,可能比较耗时且消耗大量资源。因此,可以添加测试钩子,在自动化测试中更快地验证工作流的 Continue-As-New 行为。
比如,当 test_continue_as_new == True 时,此示例将创建仅用于测试的变量 self.max_history_length,并且将其设置为较小的值。工作流中的辅助方法在每次考虑使用 Continue-As-New 时检查该变量:
def should_continue_as_new(self) -> bool:
if workflow.info().is_continue_as_new_suggested():
return True
# For testing
if (
self.max_history_length
and workflow.info().get_current_history_length() > self.max_history_length
):
return True
return False