如果lambda超时,来自SQS的一批消息是否可以再次处理


有一个SQS充当lambda的输入触发器。要从SQS中提取的记录的批量大小为10。

在处理这10条记录时,如果lambda超时,是否可以再次处理这10个记录/消息?还是将处理的那些从SQS中删除?

我试着在几个文档中寻找这个:链接1,链接2。但找不到。

如果这10条消息确实可以处理,那么我想实现的一个可能的解决方案是:在处理完消息后继续删除它们。但是,即使我删除了这些消息,一旦lambda超时,它们会变得可用吗?

您链接到的"可见性超时"页面以以下句子开头:

当消费者接收并处理来自队列的消息时,该消息将保留在队列中。

您的示例中的Lambda函数是";消费者;来自SQS的消息。它接收并处理一批消息,但这些消息仍在队列中。

还有一个关于在亚马逊SQS中使用AWS Lambda的页面,其中简要提到了这一点:

Lambda批量读取消息,并为每个批次调用一次函数。当您的函数成功处理一个批时,Lambda会从队列中删除其消息。

这里,Lambda事件源提供了";消费者;代码,并删除它知道已处理的消息。但它只有两种状态:您的Lambda函数成功了,所以该批应该被删除;或者您的Lambda函数失败,因此不应删除该批。

为了具有一些消息";成功;以及一些";"失败";,你需要告诉SQS。没有单独的动词";确认";在处理每条消息时;再次引用可见性超时页面:

因此,消费者必须在接收和处理消息后将其从队列中删除。

因此,如果Lambda函数希望将单个消息标记为已处理,则需要调用DeleteMessage API。

SQS在两种情况下会将消息重新排队到您的Lambda:

  1. 您的Lambda或Lambda服务返回/抛出错误
  2. 在Lambda未完成的情况下,已达到可见性超时

Lambda服务会将超时视为错误。因此,消息(及其记录(将再次发送到您的Lambda。如果失败的频率太高,则根据您的配置,消息要么被丢弃,要么被发送到死信队列。

如果在完全处理之前从队列中删除消息,则不会重新发送,但会有数据丢失的风险。

例如,如果您收到一条有10条记录的消息,请立即从SQS中删除该消息,然后只处理10条记录中的5条,然后超时,最后5条记录将永远不会被处理。

因此,我建议只删除已完全处理的SQS消息。

听起来很简单,但可能会变得棘手。例如:如果10条记录中有9条处理成功,但有一条处理不成功,该怎么办。理论上,您应该返回一个错误,以便整个消息(及其10条记录(可以重新排队。但之后你会重新处理这9张成功的唱片。这可能会成为一个问题,具体取决于您的应用程序设计。Idemptence是你在这里的朋友。

最新更新