我使用无服务器框架构建了一些AWS Lambda函数管道。当前有五个步骤/功能,我需要它们按顺序运行,并且每个正好运行一次。大致来说,这些功能是:
具体细节并不重要,但问题是:沿此功能线向下移动的最佳事件/触发器是什么?第一个是由HTTP调用触发的,但第一个需要以某种方式触发第二个,然后第二个触发第三个,依此类推。
我使用AWS SNS编写了所有代码,但是现在将其部署到暂存阶段,我看到了SNS often triggers more than once。我可以添加一堆代码来检测到这一点,但我宁愿不要。而且问题也变得更加复杂-如果第二个函数被触发两次,它将发送两个SNS通知来触发第三步。如果这些通知中的任何一个都加倍了,那么最后一个函数可以被调用十次而不是一次并非不合理。
那我最好的选择是什么?通过HTTP触发链?运动学也许?除了HTTP或SNS之外,我从未使用过触发器,所以我真的不确定我的选项是什么,并且保证哪些选项只能触发一次函数。
答案 0 :(得分:0)
AWS Step Functions似乎很好地针对了这种用例,该用例将单独的AWS操作绑定到具有明确定义的错误处理的一致工作流中。
不确定价格是否适合您(对于数百万次运营而言,价格可能为pricey),但可能值得一看。
也不确定性能开销或其他限制,因此YMMV。
答案 1 :(得分:0)
在该步骤中完成所需的处理后,您可以简单地异步触发下一个lambda。
因此,第一个lambda由HTTP调用触发,在该lambda执行中,完成此步骤后,只需异步启动下一个lambda函数 ,而不是通过SNS或Kinesis发送触发器。在每个步骤中重复此过程。这样可以保证lambda一次性执行所有步骤。
答案 2 :(得分:0)
事件Lambda触发器(SNS,S3,CloudWatch等)通常保证至少一次调用,而不是完全一次。如您所述,您必须例如通过在DynamoDB中跟踪事件ID(使用strongly consistent reads!)或实现idempotent Lambdas(即功能)来手动手动处理重复数据删除即使使用相同的输入多次调用也不会产生任何其他影响。在您的示例中,步骤4本质上是幂等的,条件是该功能除了存储更改后的副本之外没有任何副作用,并且新副本将覆盖具有相同事件ID的所有先前存储的副本。
SQS FIFO是一项保证开箱即用的一次准确交付的服务。不幸的是,该服务不能用于直接触发Lambda,因此您必须设置一个预定的Lambda来定期轮询FIFO队列(按照this answer)。在您的情况下,您可以按照这种安排处理第5步,因为我假设您不想多次将相同的资源提交给目标API。
因此,总的来说,这是我的处理方法:
采用这种安排,即使偶尔在同一个S3上传事件中执行Lambda B两次或更多次,也不会造成任何危害,因为FIFO SQS队列会在流到达Lambda C之前为您处理重复数据删除。
答案 3 :(得分:0)
AWS Step功能适合您:https://docs.aws.amazon.com/step-functions/latest/dg/welcome.html
您将根据先前的执行输出执行所需的步骤。 每个任务/步骤只需要在想要的“状态”下正确输出json。
https://docs.aws.amazon.com/step-functions/latest/dg/concepts-states.html
根据状态,您的工作流程将继续进行。您可以轻松创建工作流程并触发lambda或ECS任务。 ECS任务是您自己的“ lambda”环境,运行时不受AWS Lambda环境的限制。
使用ECS任务,您可以在Bare metal,您自己的EC2计算机上或在ECS上的ECS Docker容器中运行,因此具有无限的资源可扩展性限制。 与Lambda相比,其限制非常严格:500Mb的磁盘,执行时间受限制等。