以编程方式重新运行SWF工作流



在过去的一年中,由于各种活动错误,我们有几千个SWF工作流失败了。因为bug是长期存在的,所以所有的活动重试都失败了,工作流被关闭了。我想重新运行所有那些失败的工作流,在最后执行的活动(并且失败了)处拾取。一个基本的工作流重新触发。

SWF控制台有一个Re-Run命令,但是它一次只能让你选择25个工作流,远远少于我需要的数千个。

我可以使用CLI start-workflow-execution命令(或类似的API调用),但我不知道在哪里可以像控制台的"重新运行"操作那样获得最新的工作流输入。我可以从get-workflow-execution-history获得最近的工作流输入,但这需要我知道最近的runId,我找不到任何方法来获得它。

总结:

  1. 我能想到的以编程方式重新运行SWF工作流的唯一方法是:对于每个失败的工作流,神奇地抓取其最近的runId,然后通过get-workflow-execution-history抓取其最近的工作流输入,然后通过start-workflow-execution使用该输入重新启动它。有没有更好的办法?
  2. 如果#1的答案是"没有更好的方法",那么我如何找到特定workflowId的最新runId ?

(事实上,我找不到任何关于这种触发的文档或讨论,这让我担心我的方法是错误的,所以我欢迎反馈来纠正我。)

UPDATE:更高层次的问题:处理由于错误条件而终止的工作流的正确方法是什么?重新触发SWF工作流如此困难的事实使我认为我误解了SWF范例。

    听起来很合理。请注意,重新执行工作流不会从上一次失败的活动重新启动,而是从开始(历史记录为空)重新启动。
  1. 你可以使用ListClosedWorkflowExecutions来获取最近的runId。请注意,它支持workflowId作为过滤器参数。

UPDATE:更高层次的问题:处理由于错误条件而终止的工作流的正确方法是什么?

SWF拥有从失败点重新尝试工作流的一切,因为保留了整个工作流执行历史。不幸的是,开箱即用的AWS Flow Framework不会执行上一次运行的状态恢复。但这不是一个固有的限制,这个功能可以添加。

更新2:

Temporal Workflow是一个开源平台,它基于与SWF相同的高级思想,它支持重置功能,允许通过使用历史子集创建新运行来从任何点重新启动工作流。

我认为你不能用这种方式做这件事。工作流历史保留的最大值是90天,所以即使你沿着获取工作流执行历史的路径走下去,你也可以重新启动过去90天内失败的工作流此外,aws对swf api调用的数量和速率有帐户级别的限制,因此,一旦您开始在循环中调用以获取历史记录并启动工作流,您就会过早地达到此级别并开始遇到异常。更好的方法是查看工作流执行的起始点,并通过传递相同的输入重新运行失败的执行。

最新更新