来自 DynamoDB 的 AWS Lambda 处理流

Sim*_*evi 8 streaming amazon-dynamodb aws-lambda amazon-dynamodb-streams

我正在尝试创建一个使用来自 dynamoDB 表的流的 lambda 函数。但是我想知道处理在执行过程中可能因某些错误而未处理的数据的最佳做法是什么?例如,我的 lambda 失败了,而且我有很多流,这是重新处理丢失数据的最佳方法?

谢谢

tle*_*eef 10

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

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

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

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

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

TLDR:使用 SQS 队列。


小智 8

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

AWS Lambda现在支持从 DynamoDB表流进行同步流读取的 DLQ 。

结合此功能,我推荐以下流程:

  1. 配置事件源映射以包含 DLQ arns 并设置重试尝试计数。经过多次重试后,批处理元数据将被移动到 DLQ。
  2. 针对 DLQ 消息可见性设置警报,以获取有关受影响记录的警报。
  3. DLQ 消息可用于使用 KCL 库检索受影响的流记录

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


Ash*_*han 2

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

如果执行时出现错误,您需要在代码中处理它,除非 Lambda 不会继续处理流中的剩余消息。

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