AWS Step 函数的两阶段启动?
Two-Phase Starting of an AWS Step Function?
场景
我正在寻找一种创建步进函数实例的方法,该实例等待我启动它。伪代码看起来像这样。
StateMachine myStateMachine = new();
string executionArn = myStateMachine.ExecutionArn;
myStateMachine.Start();
用例
我们需要一种方法来将步骤函数的执行 ARN 可靠地存储到数据库中。如果我们未能将执行 ARN 写入数据库,我们将不会调用 Start
方法并且步骤函数应该超时。如果step函数启动失败,会回滚数据库操作
这些是我们计划采取的步骤
- 本地事务已启动
- 步骤函数实例已创建,但未启动
- 创建的step函数实例的ExecutionArn记录在数据库中
- 阶梯功能开启
- 本地事务已提交
有没有简单的方法来启动这样的步进函数?
以下是我迄今为止对此所做的一些研究的结果。
手动回调
本文中的以下信息https://aws.amazon.com/blogs/compute/implementing-serverless-manual-approval-steps-in-aws-step-functions-and-amazon-api-gateway/,
我创建一个空的 activity,然后将此 activity 作为步骤函数的第一步,并向 activity 步骤添加 30 秒的超时。期望是,如果我没有向步骤函数中的 activity 任务发送成功,那么该步骤将超时并且工作流将失败,但它并没有这样做。即使我将超时设置为 30 秒,该步骤也没有超时。我猜超时是关于等待 step 函数能够安排 activity 的时间,而不是等待 step 函数从 activity 步骤继续的时间。
我还考虑过使用 SQS SendMessage
步骤,检查 Wait for callback
并设置类似的超时,但这需要我创建一个一次性的 SQS 队列来包含我不打算包含的消息阅读,另外我猜超时功能在这里和 activity.
中一样工作
等待状态
我可以按照这篇 SO 文章中接受的答案对等待状态和并行分支做一些事情:,但在我走那条路之前,我想看看是否有更简单的方法可以完成。
全局超时
我发现步骤函数有一个全局超时,在这种情况下,如果我将它与一个暂停直到我的应用程序明确恢复它的步骤结合使用,这在这种情况下很有用,但全局超时只有在它出现时才有用可以相当低(比如 20 分钟)并且仍然具有适用于所有用例的步进函数。例如,如果 运行 步进函数所需的最长时间是 2 或 3 分钟,那么一切都很好。但是,如果我在 step 函数中有另一个步骤可能需要超过 20 分钟,那么我就不能再使用全局计时器,或者我必须开始将它设置为非常高的值,这是我不想做的。
这里有什么我可以轻松完成但我忽略的事情吗?
谢谢
Two-phase 无法完成步进函数的初始化。我们通过以下方式解决了这个问题:
- 我们的应用程序:在我们的数据库中写入一行以指示启动步进函数的意图
- 我们的应用:启动步进功能
- 我们的应用:在创建的行记录step函数实例的ExecutionArn
- 步进函数:让步进函数无限期地等待 SQS 步骤的步骤 1
- 我们的应用程序:轮询 SQS 队列并中止步骤函数或通过向 SQS 步骤发送回调允许其继续下一步。 (这是第二期)
场景
我正在寻找一种创建步进函数实例的方法,该实例等待我启动它。伪代码看起来像这样。
StateMachine myStateMachine = new();
string executionArn = myStateMachine.ExecutionArn;
myStateMachine.Start();
用例
我们需要一种方法来将步骤函数的执行 ARN 可靠地存储到数据库中。如果我们未能将执行 ARN 写入数据库,我们将不会调用 Start
方法并且步骤函数应该超时。如果step函数启动失败,会回滚数据库操作
这些是我们计划采取的步骤
- 本地事务已启动
- 步骤函数实例已创建,但未启动
- 创建的step函数实例的ExecutionArn记录在数据库中
- 阶梯功能开启
- 本地事务已提交
有没有简单的方法来启动这样的步进函数?
以下是我迄今为止对此所做的一些研究的结果。
手动回调
本文中的以下信息https://aws.amazon.com/blogs/compute/implementing-serverless-manual-approval-steps-in-aws-step-functions-and-amazon-api-gateway/, 我创建一个空的 activity,然后将此 activity 作为步骤函数的第一步,并向 activity 步骤添加 30 秒的超时。期望是,如果我没有向步骤函数中的 activity 任务发送成功,那么该步骤将超时并且工作流将失败,但它并没有这样做。即使我将超时设置为 30 秒,该步骤也没有超时。我猜超时是关于等待 step 函数能够安排 activity 的时间,而不是等待 step 函数从 activity 步骤继续的时间。
我还考虑过使用 SQS SendMessage
步骤,检查 Wait for callback
并设置类似的超时,但这需要我创建一个一次性的 SQS 队列来包含我不打算包含的消息阅读,另外我猜超时功能在这里和 activity.
等待状态
我可以按照这篇 SO 文章中接受的答案对等待状态和并行分支做一些事情:
全局超时
我发现步骤函数有一个全局超时,在这种情况下,如果我将它与一个暂停直到我的应用程序明确恢复它的步骤结合使用,这在这种情况下很有用,但全局超时只有在它出现时才有用可以相当低(比如 20 分钟)并且仍然具有适用于所有用例的步进函数。例如,如果 运行 步进函数所需的最长时间是 2 或 3 分钟,那么一切都很好。但是,如果我在 step 函数中有另一个步骤可能需要超过 20 分钟,那么我就不能再使用全局计时器,或者我必须开始将它设置为非常高的值,这是我不想做的。
这里有什么我可以轻松完成但我忽略的事情吗?
谢谢
Two-phase 无法完成步进函数的初始化。我们通过以下方式解决了这个问题:
- 我们的应用程序:在我们的数据库中写入一行以指示启动步进函数的意图
- 我们的应用:启动步进功能
- 我们的应用:在创建的行记录step函数实例的ExecutionArn
- 步进函数:让步进函数无限期地等待 SQS 步骤的步骤 1
- 我们的应用程序:轮询 SQS 队列并中止步骤函数或通过向 SQS 步骤发送回调允许其继续下一步。 (这是第二期)