如何限制步骤功能中步骤的并发

时间:2020-03-11 00:54:51

标签: amazon-web-services aws-lambda aws-step-functions

我在AWS中有一个状态机。我想限制任务的并发(通过lambda创建),以减少到我的下游API之一的访问量。

我可以限制lambda并发,但是任务失败,并显示“ Lambda.TooManyExecutions”失败。有人可以分享一种简单的方法来限制lambda任务的并发性吗?

谢谢, 维诺德。

2 个答案:

答案 0 :(得分:0)

您可以使用所提到的lambda并发性,然后在您的step函数中添加一个retry子句,以便当您达到并发限制时,step函数可以管理失败的任务的重试。

https://docs.aws.amazon.com/step-functions/latest/dg/concepts-error-handling.html#error-handling-examples

重试次数有限制,但是您可以定义重试次数。

或者,如果您想无限制地重试,则可以在引发该并发时使用catch将其移至Wait状态。您也可以在上面的链接中了解有关渔获的信息。这是一个等待状态文档。

https://docs.aws.amazon.com/step-functions/latest/dg/amazon-states-language-wait-state.html

完成等待后,您只需将等待状态转换回任务状态。

答案 1 :(得分:0)

您可以使用Map state并行运行这些任务,并使用最大并发设置来减少过多的lambda执行。

Map状态(“ Type”:“ Map”)可用于为输入数组的每个元素运行一组步骤。并行状态使用相同的输入执行步骤的多个分支,而映射状态将对状态输入中的数组的多个条目执行相同的步骤。

  • MaxConcurrency(可选) MaxConcurrency字段的值是一个整数,它提供了可以并行运行Iterator的调用次数的上限。例如,MaxConcurrency值为10会将您的Map状态限制为一次运行10个并发迭代。

这应该减少出现问题的可能性。也就是说,对于这些情况,您仍然可以从添加重试语句中受益。 Here's an example

{
  "Retry": [ {
    "ErrorEquals": [ "Lambda.ServiceException", "Lambda.AWSLambdaException", "Lambda.SdkClientException"],
    "IntervalSeconds": 2,
    "MaxAttempts": 6,
    "BackoffRate": 2
  } ]
}