SQS 消息在被 Lambda 处理后仍保持处理状态。

6

SQS消息可以被Lambda成功处理。这是处理并执行回调的代码:

 exports.handler = function(event, context, callback) {
   handleSQSMessages(context,event, function () {
    const response = {
        statusCode: 200,
        body: JSON.stringify({
            message: 'SQS event processed.',
            input: event,
        }),
    };
    console.log ("OK DONE");
    callback(null, response);

function handleSQSMessages(context, messages, callback) {
 messages = messages.Records;
 if (messages && messages.length > 0) {
   messages.forEach(function(message) {
       console.log(message);
       //...

我看到 CloudWatch 打印了“OK DONE”消息。然而,SQS 会将消息放在‘正在传送中’状态(并且它将一直处于此状态)。我的理解是,一旦成功的响应被发送,该消息将自动删除。我的可见性计时器为10分钟。


2
据我理解,Lambda 应该在成功响应后自动删除。 - Siddharth Ram
1
Lambda通过轮询队列并使用包含队列消息的事件同步调用您的函数。Lambda以批处理方式读取消息,并为每个批次调用一次函数。当您的函数成功地处理一个批次时,Lambda将从队列中删除其消息。 - Siddharth Ram
今天我学到了一些东西 - 谢谢。由于Lambda是事件驱动的,而SQS是轮询驱动的,所以我之前没有将它们一起使用过。看起来你的代码与node.js示例类似,只是它只处理一个消息。你不想处理所有可用的消息吗? - stdunbar
我不确定你的意思。我确实查看所有消息,但它在handleSQSMessages函数中,我没有发布(event.Record在那里处理)。 - Siddharth Ram
1
AWS的示例中有一个forEach。你的链接说,如果你不响应批处理(即给定的所有消息),那么它就不会删除这些消息。你是否在读取所有内容? - stdunbar
显示剩余5条评论
2个回答

0

您可以将context.callbackWaitsForEmptyEventLoop设置为false,以立即发送回调响应,而不是等待所有事件循环任务完成。


0

你好像缺少一些闭合的括号/花括号。 在 handleSQSMessages 回调函数中是否调用了 handler 回调函数?由于缺少括号,很难确定 - 但如果没有调用,那可能就是它失败的原因。


我发布了一段代码片段。代码运行良好。我将数据存储在Aurora中,这正是我想要的。然而,尽管回调被调用,但消息并未从SQS中删除。 - Siddharth Ram

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接