AWS Lambda 处理来自 DynamoDB 的流

2024-02-25

我正在尝试创建一个消耗 dynamoDB 表中的流的 lambda 函数。但是我想知道处理在执行过程中可能因某些错误而未处理的数据的最佳实践是什么?例如,我的 lambda 失败并且丢失了部分流,这是重新处理丢失数据的最佳方法?


这是为你处理的。 DynamoDB Streams 与 Kinesis Streams 一样,将重新发送记录,直到成功处理它们。当您使用 Lambda 处理流时,这意味着成功退出该函数。如果出现错误且函数意外退出,DynamoDB 流将简单地重新发送正在处理的记录。

好处是保证您至少被处理一次,但是,您需要注意一些事情。与 Kinesis Streams 一样,DynamoDB Streams 保证按顺序处理记录。这样做的副作用是,当记录无法处理时,会重试,直到成功处理或从流中过期(可能需要几天)before处理流中其后面的任何记录。

如何解决这个问题取决于您的应用程序的需求。如果您需要至少一次处理,但不需要保证所有记录都按顺序处理,我只需将记录放入 SQS 队列中,然后从队列中进行处理。 SQS 队列还将重试未成功处理的记录,但是与 DynamoDB 和 Kinesis Streams 不同,记录不会在队列中相互阻塞。如果您在将记录从 DynamoDB 流传输到 SQS 队列时遇到错误,您可以重试,但这可能会在 SQS 队列中引入重复项。

如果顺序很关键或不能容忍重复,您可以使用 SQS FIFO 队列。 SQS FIFO 队列与(标准)SQS 队列类似,不同之处在于它们保证按顺序将消息传递给消费者,并且具有重复数据删除窗口(5 分钟),在该窗口内添加到队列中的任何重复项都将被丢弃。

在这两种情况下,当使用SQS队列处理消息时,您可以设置一个死信队列,如果消息处理N次失败,则可以自动发送消息。

TLDR:使用 SQS 队列。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AWS Lambda 处理来自 DynamoDB 的流 的相关文章

随机推荐