Programmatically Re-Running SWF Workflows
我们有数千个SWF工作流在过去一年中由于各种活动错误而失败。由于这些错误的寿命很长,因此所有活动重试均失败,并且工作流已关闭。我想重新运行所有那些失败的工作流程,以最后执行(失败)的活动为准。基本的工作流程重新触发。
SWF控制台有一个"重新运行"命令,但是它一次只能选择25个工作流程,远远少于我需要的数千个工作流程。
我可以使用CLI start-workflow-execution命令(或类似的API调用),但是我不知道如何通过控制台的"重新运行"操作来获取最新的工作流输入做。我可以从get-workflow-execution-history获取最新的工作流输入,但是这要求我知道最新的runId,而且我找不到任何方法来获取它。
总结:
我可以想到的以编程方式重新运行SWF工作流的唯一方法是:对于每个失败的工作流,神奇地捕获其最新的runId,然后通过get-workflow-execution-history捕获其最新的工作流输入,然后通过。有没有更好的办法?
如果对#1的回答是"没有更好的方法,"那么我如何找到特定workflowId的最新runId?
(我找不到有关此类触发器的任何文档或讨论的事实,使我担心自己会以错误的方式进行操作,因此欢迎您提出反馈意见。)
更新:更高级别的问题:处理由于错误情况导致所有重试的时间终止的工作流的正确方法是什么?重新触发SWF工作流非常困难,这一事实使我认为我误解了SWF范例。
听起来很合理。请注意,重新执行工作流程不会从上一次失败的活动开始,而是从头开始(历史记录为空)。
您可以使用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临时平台,基于与SWF相同的高级思想,它确实支持重置功能,该功能允许通过创建具有历史记录子集的新运行从任何点重新启动工作流。
- 是的,我一直指望从一开始就重新开始。 (我希望使用与上一个工作流程相同的历史记录来重新启动,但是我看不到有任何方法可以这样做,这可能会带来意想不到的后果。我会从头开始重新启动。) @Rohit关于最大工作流历史记录保留期限的观点?
-
如果打算在保留期后使用它,则始终可以将历史记录转储到S3中。
-
我的想法是有一个分支,当daysSinceStarted <90时使用this(^^)方法,并在daysSinceStarted> = 90时从存储中拉出。
-
那行得通。我一直想直接将以前运行历史中的工作流重播合并到Flow Framework中。但从来没有去过:(。
我认为您不能以这种方式来做。最大工作流历史记录保留时间为90天,因此即使您沿用获取工作流执行历史记录的路径,也可以重新启动过去90天失败的工作流
此外,aws对帐户的数量和速率也有帐户级别的限制,因此您可以进行swf api调用,因此一旦开始循环调用以获取历史记录并启动工作流程,您就太早达到该级别并开始出现异常。
解决此问题的更好方法是查看工作流执行从何处开始,并通过传入相同的输入来再次重新运行失败的执行。
-
您的建议听起来与我的建议完全相同:重新启动失败的工作流程,传递与先前启动工作流程时相同的输入。我想念什么吗? (限制帐户级别的费率很麻烦,但我可以解决这个问题。)
-
否。如果您有失败的工作流程列表和开始时输入的信息,则只需继续并再次运行它们即可。
-
对于巨大的星号,我无法在90天内使用此方法。
-
在我们公司中,我们大量使用swf,并且在日志中具有每个工作流程执行的输入和失败的所有详细信息。因此,我们不会转到工作流控制台来获取执行失败的列表,而只会获取日志文件。