来自 DynamoDB 的 AWS Lambda 处理流

AWS Lambda processing stream from DynamoDB

我正在尝试创建一个使用来自 dynamoDB table 的流的 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 队列,除了它们保证按顺序将消息传递给消费者并且具有重复数据删除 window(5 分钟),其中任何重复项都添加到 window 将被丢弃。

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

TLDR:使用 SQS 队列。

DynamoDB Streams 为每个事件调用 Lambda 函数,直到它成功处理它(直到代码调用成功回调)。

在执行时出现错误情况,您需要在代码中处理它,否则 Lambda 将不会继续处理流中的剩余消息。

如果出现由于错误需要单独处理消息的情况,您可以使用死信队列(使用Amazon SQS)推送消息并继续处理流中的剩余项目。您可以有一个单独的逻辑来处理此队列中的消息。

更新此线程,因为所有现有答案都已过时。

AWS Lambda now supports the DLQs for synchronous steam read from DynamoDB table 流。

在上下文中使用此功能,这是我推荐的流程:

  1. Configure 事件源映射以包含 DLQ arns 并设置 retry-attempts 计数。在多次重试之后,批处理元数据将被移动到 DLQ。
  2. Set-up DLQ 消息可见性警报以获取有关受影响记录的警报。
  3. DLQ 消息可用于检索受影响的流record using KCL library

提示:您可以使用属性“Bisect on Function Error”启用批处理拆分。使用此选项,lambda 将能够缩小受影响记录的范围。