【发布时间】:2019-08-02 15:33:26
【问题描述】:
我有附加到 DynamoDB 更改事件的 Lambda 函数。 当我更改/修改 DynamoDB 的 Test-machines 表中的项目时,Lambda 会触发两次。
我正在将IsMachineOn 的值从True 修改为False,这是两次触发Test-Machine-On-alert-status Lambda 函数。
我不明白为什么两次 lambda 是触发器。
我观察到 Lambda 的 event 参数中的 records 有一个小的变化。
对于第一次触发,
NewImage["IsMachineOn"]["BOOL"] 的值为 False
OldImage["IsMachineOn"]["BOOL"] 的值为 True
对于第二次触发,
NewImage["IsMachineOn"]["BOOL"] 的值为 False
OldImage["IsMachineOn"]["BOOL"] 的值为 False
我在NewImage["IsMachineOn"]["BOOL"]==False 上有业务逻辑,因此我的业务逻辑运行了两次。
有两件事:
- 为什么 Lambda 运行两次?
- 有什么办法可以解决此问题?
【问题讨论】:
-
为了保证至少交付一次,这个多次调用的东西将probably happen。关键是,我们是否应该认为您的 Lambda 函数是非幂等的?如果是这样,将其设为一个将是一种解决方法。
-
@vahdet:我的 Lambda 函数不是幂等的。每次请求 id 都不一样。
-
这种行为并不一定会让你的代码具有幂等性,但无论如何;如果你严格要求只发射一次,我现在想不出解决办法。
-
您的逻辑当然应该测试
NewImage["IsMachineOn"]["BOOL"] == False && NewImage["IsMachineOn"]["BOOL"] != OldImage["IsMachineOn"]["BOOL"](现在关闭,这也是一个状态更改事件)......但听起来好像第二个不同的更新正在触发第二个事件,因此,您可能应该查看其他属性,以确定第二个事件触发器的性质。这不能 - 根据定义 - 是同一事件上的第二个 Lambda 触发器,如果新旧的一个不同而另一个相同。 -
关于这个主题有一篇很好的博文:cloudonaut.io/… 从中学到的主要内容:确保你的 Lambda 函数是幂等的,并且可以处理潜在的多次执行。
标签: aws-lambda amazon-dynamodb