在处理这10条记录时,如果lambda超时,是否可以再次处理这10个记录/消息?还是将处理的那些从SQS中删除?
我试着在几个文档中寻找这个:链接1,链接2。但找不到。
如果这10条消息确实可以处理,那么我想实现的一个可能的解决方案是:在处理完消息后继续删除它们。但是,即使我删除了这些消息,一旦lambda超时,它们会变得可用吗?
您链接到的"可见性超时"页面以以下句子开头:
当消费者接收并处理来自队列的消息时,该消息将保留在队列中。
您的示例中的Lambda函数是";消费者;来自SQS的消息。它接收并处理一批消息,但这些消息仍在队列中。
还有一个关于在亚马逊SQS中使用AWS Lambda的页面,其中简要提到了这一点:
Lambda批量读取消息,并为每个批次调用一次函数。当您的函数成功处理一个批时,Lambda会从队列中删除其消息。
这里,Lambda事件源提供了";消费者;代码,并删除它知道已处理的消息。但它只有两种状态:您的Lambda函数成功了,所以该批应该被删除;或者您的Lambda函数失败,因此不应删除该批。
为了具有一些消息";成功;以及一些";"失败";,你需要告诉SQS。没有单独的动词";确认";在处理每条消息时;再次引用可见性超时页面:
因此,消费者必须在接收和处理消息后将其从队列中删除。
因此,如果Lambda函数希望将单个消息标记为已处理,则需要调用DeleteMessage API。
SQS在两种情况下会将消息重新排队到您的Lambda:
- 您的Lambda或Lambda服务返回/抛出错误
- 在Lambda未完成的情况下,已达到可见性超时
Lambda服务会将超时视为错误。因此,消息(及其记录(将再次发送到您的Lambda。如果失败的频率太高,则根据您的配置,消息要么被丢弃,要么被发送到死信队列。
如果在完全处理之前从队列中删除消息,则不会重新发送,但会有数据丢失的风险。
例如,如果您收到一条有10条记录的消息,请立即从SQS中删除该消息,然后只处理10条记录中的5条,然后超时,最后5条记录将永远不会被处理。
因此,我建议只删除已完全处理的SQS消息。
听起来很简单,但可能会变得棘手。例如:如果10条记录中有9条处理成功,但有一条处理不成功,该怎么办。理论上,您应该返回一个错误,以便整个消息(及其10条记录(可以重新排队。但之后你会重新处理这9张成功的唱片。这可能会成为一个问题,具体取决于您的应用程序设计。Idemptence是你在这里的朋友。