防止重复的 DynamoDB 事务

Prevent duplicate DynamoDB transaction

您好,我将一个 Lambda 函数视为 webhook。可以使用相同的数据同时多次调用 webhook。在 lambda 函数中,我检查事务记录是否存在于 DynamoDB 中。如果它存在于 db 中,Lambda 只需 returns 否则它会进一步执行。这里出现的问题是,当检查 db 中的记录是否再次调用 Lambda 时,该检查失败,因为先前的事务仍未插入到 db 中。并且事务可以多次执行。 我的问题是如何处理这种情况。 SQS 在这种情况下会有帮助吗?

您可以为此使用乐观锁定。我已经 written a more detailed blog 实现了它,但这里是核心思想。

对于每个项目,您都会跟踪一个始终递增的版本号。项目的每次更新都会将版本号增加一个。

当你想要执行更新时,你首先读取旧项目并将其版本号存储在本地。然后在本地更改项目并增加其版本号。当您将其写回事务中的 table 时,您添加了条件写入。条件是该项目的当前版本号与您阅读时的版本号相同。

这意味着如果同时更新了项目,交易将失败。乐观锁定可帮助您进行碰撞检测,并且在此类碰撞相对罕见的假设下是一个很好的解决方案。如果它们更频繁,您最好使用不同的锁定策略。

乐观锁定将帮助您确定您担心的情况。它不会解决它们,您必须自己实施。 一种常见的冲突解决方法是再次阅读该项目并检查您的更改是否已应用。

“如果它存在于 db 中,lambda 简单地 return 否则它会进一步执行”鉴于此,是否可以使用 FIFO 队列并使用数据中的一些“键”作为重复数据删除 ID (fifo) 和这意味着所有重复的消息永远不会符合您的逻辑,然后您还需要 dynamodb 的“强一致性”选项。