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

Programmatically Re-Running SWF Workflows

我们有几千个 SWF 工作流在过去一年中由于各种 activity 错误而失败。由于错误长期存在,所有 activity 次重试均失败,工作流已关闭。我想重新 运行 所有那些失败的工作流程,从上次执行(但失败)的 activity 开始。一个基本的工作流程重新触发。

SWF 控制台有一个 Re-Run 命令,但它一次只能让您 select 二十五个工作流程,远远少于我需要的数千个。

我可以使用 CLI start-workflow-execution command (or analogous API call), but I can't figure out where to get the most recent workflow input the way the Console's 'Re-Run' operation does. I can get the most recent workflow input from get-workflow-execution-history,但这需要我知道最新的 runId,但我找不到任何方法来获取它。

总结一下:

  1. 我能想到的以编程方式重新 运行 SWF 工作流的唯一方法是:对于每个失败的工作流,神奇地获取其最新的 runId,然后通过 [= 获取其最新的工作流输入21=]。有没有更好的方法?
  2. 如果 #1 的答案是 "There is no better way," 那么我如何找到特定 workflowId 的最新 runId

(我找不到关于此类重新触发的任何文档或讨论这一事实让我担心我以错误的方式处理这个问题,所以我欢迎反馈让我直截了当。)

更新: 更高级别的问题:处理因错误情况而终止的工作流的正确方法是什么?重新触发 SWF 工作流如此困难这一事实让我觉得我误解了 SWF 范例。

  1. 听起来很有道理。请注意,重新执行工作流不会从上次失败的 activity 开始,而是从头开始(历史为空)。
  2. 您可以使用 ListClosedWorkflowExecutions 获取最新的 runId。请注意,它支持 workflowId 作为过滤器参数。

UPDATE: Higher level question: What is the right way to handle workflows that terminated due to error conditions that outlasted all retries?

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

UPDATE 2:

Temporal Workflow an open source platform, which is based on the same high-level ideas as SWF, does support reset feature 允许通过创建一个包含历史子集的新 运行 从任意点重新启动工作流。

我不认为你可以用这种方式做到这一点。工作流历史记录的最长保留时间为 90 天,因此即使您沿着获取工作流执行历史记录的路径前进,您也可以重新启动过去 90 天内失败的工作流 此外,aws 对您可以进行 swf api 调用的次数和速率有帐户级别限制,因此一旦您开始循环调用以获取历史记录并启动工作流程,您就会过早达到此级别并开始出现异常. 解决此问题的更好方法是查看工作流执行的起始点,并通过传入相同的输入再次 运行 失败的执行。