【问题标题】:How to find out if this is the last iteration in AWS Step Functions map task?如何确定这是否是 AWS Step Functions 地图任务中的最后一次迭代?
【发布时间】:2022-10-18 22:16:25
【问题描述】:

我有一个迭代我的数组的 Map 状态。在地图状态中,有一个 Lambda 任务和一个等待任务。等待任务等待很长时间,我只需要在迭代之间等待。因此,如果这是最后一次迭代,我想跳过等待,因为不需要它。

每次物品不同,数量也不同。

但是,地图上下文只有$$.Map.Item.Index$$.Map.Item.Value变量。例如,我找不到任何关于总步数的变量的提及。

我怎样才能做到这一点?

【问题讨论】:

  • 您想确定“最后一次迭代”。你是什​​么意思?给定 Map 状态项 [A, B, C],最后一次迭代是什么?是“C”,项目数组中的最后一个元素吗?或者也许是“B”,如果“A”和“C”先完成?
  • @fedonev我的并发性有限,所以他们一一进行。所以那是C。但实际上,哪个是序列并不重要。我需要知道没有更多,所以这绝对是最后一个 - 无论是 A、B 还是 C。
  • 我问是因为让每次迭代都反省它是否是“C”(最后一个数组项)是一个确定且简单的问题。反思并发迭代是否是最后一个仍在运行的迭代是一个不确定的难题。
  • @fedonev 是的,这就是每次物品不同且数量不同的问题。
  • 你对完成的定义是什么?为了ñ地图状态中的项目(其中ñ事先不知道),之后尽快退出状态N-1项目(除了“最后一次迭代”之外的所有项目)都完成了吗?

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


【解决方案1】:

我的理解:每次执行都有任意数量的 Map 项目应该连续运行(即MaxConcurrency:1)。您不希望在最后一项之后有任何延迟。例如,具有 4 个项目 [A, B, C, D] 的执行应按以下顺序运行:Lambda(A), Wait, Lambda(B), Wait, Lambda(C), Wait, Lambda(D)。单项执行[A] 应该只运行Lambda(A)

这是一种方法:

[更新 - 2022 年末:使用新的 ArrayLengthMathAdd intrinsic functions 我们可以在没有 lambda 的情况下计算最后一项索引 - 请参阅下面的 "LastItemIndex.$"]

  1. 在 Map State 之前插入一个 Lambda 任务。 Lambda 计算项目并将最后一个项目的索引输出到$.itemsCounter.lastItemIndex

  2. 在 Map State 上使用 Parameters 将最后一项和项索引添加到 Map 迭代的有效负载中:

    // add to the Map State definition - overrides what each iteration receives
    "Parameters": {
      "Index.$": "$$.Map.Item.Index",
      "Data.$": "$$.Map.Item.Value",  // by default, each iteration just gets this
      "LastItemIndex.$": "States.MathAdd(States.ArrayLength($$.Execution.Input.Items), -1)", // 3 for {"Items": [A,B,C,D]}
    },
    
    1. 在 Lambda 任务和等待状态之间的映射内添加 ShouldWait? 选择状态。继续等待,除非 $.Index 等于 $.LastItemIndex

【讨论】:

  • 谢谢,听起来很合理,我会试一试并发布结果!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-11
  • 1970-01-01
  • 2020-11-30
  • 1970-01-01
  • 1970-01-01
  • 2020-02-27
相关资源
最近更新 更多