使用Dynamodb和SNS的Lambda函数 - 超时

问题描述 投票:1回答:1

我试图在SNS服务中使用DynamoDb Item值来发送通知。它失败了超时错误但是从Dynamodb获取成功并且还发送了通知。但它会在处理多次后继续重试和超时。

{“errorMessage”:“2018-01-02T10:14:55.463Z c18d142e-efa5-11e7-8671-7f3af13c58c7任务在10.01秒后超时”}

现在,我也尝试使用参数context.callbackWaitsForEmptyEventLoop = false,但没有多大帮助!似乎没有正确使用它。

下面是一段代码,有人可以协助:

exports.handler = function (event, context, callback) {

var AWS = require('aws-sdk');
var doc = require('dynamodb-doc');
var dynamodb = new doc.DynamoDB();

var params = {    
TableName : 'abcmsg',
ProjectionExpression: 'Message',
  Key : { 
   "ind" : "ABC10"
    }
};

var MESSAGE_ID = getmsg();

function getmsg(MESSAGE_ID) {
dynamodb.getItem(params, function (err, data) {
        if (err) {
             console.log('ERROR: Dynamo Failed:', err);
             getmsg(err);
        } else {
               console.log('Dynamo Success: ' + JSON.stringify(data, null, '  ')); 
               let MESSAGE_ID = data['Item'].Message;
               console.log('data',data['Item'].Message); 
               getmsg(MESSAGE_ID);        
        }
});


console.log('MESSAGE_ID',MESSAGE_ID); //print the correct value 'ABCD'

var sns = new AWS.SNS({
      region:'eu-west-1',
      maxRetries: 0

});

sns.publish({
Message: MESSAGE_ID,
Subject:"Test Message",
TopicArn:"arn:aws:sns:eu-west-1:0123456789012:Lambda"
}, function (err, data) {
if (err) {
console.log(err.stack);
return;
}
console.log('push sent');
});

callback(null,{ "statusCode": 200 });
context.callbackWaitsForEmptyEventLoop = false;

}

};

日志:-----

2018-01-02T10:14:55.005Z c18d142e-efa5-11e7-8671-7f3af13c58c7发电机成功:{“项目”:{“消息”:“ABCD”}} 2018-01-02T10:14:55.005Z c18d142e-efa5 -11e7-8671-7f3af13c58c7数据ABCD 2018-01-02T10:14:55.006Z c18d142e-efa5-11e7-8671-7f3af13c58c7 MESSAGE_ID ABCD 2018-01-02T10:14:55.028Z c18d142e-efa5-11e7-8671-7f3af13c58c7 push sent 2018-01-02T10:14:55.086Z c18d142e-efa5-11e7-8671-7f3af13c58c7发电机成功:{“项目”:{“消息”:“ABCD”}} 2018-01-02T10:14:55.105Z c18d142e-efa5 -11e7-8671-7f3af13c58c7数据ABCD 2018-01-02T10:14:55.106Z c18d142e-efa5-11e7-8671-7f3af13c58c7 MESSAGE_ID ABCD 2018-01-02T10:14:55.127Z c18d142e-efa5-11e7-8671-7f3af13c58c7 push sent 2018-01-02T10:14:55.167Z c18d142e-efa5-11e7-8671-7f3af13c58c7发电机成功:{“项目”:{“消息”:“ABCD”}} 2018-01-02T10:14:55.185Z c18d142e-efa5 -11e7-8671-7f3af13c58c7数据ABCD 2018-01-02T10:14:55.186Z c18d142e-efa5-11e7-8671-7f3af13c58c7 MESSAGE_ID ABCD 2018-01-02T10:14:55.226Z c18d142e-efa5-11e7-8671-7f3af13c58c7 push sen t 2018-01-02T10:14:55.253Z c18d142e-efa5-11e7-8671-7f3af13c58c7发电机成功:{“项目”:{“消息”:“ABCD”}} 2018-01-02T10:14:55.265Z c18d142e- efa5-11e7-8671-7f3af13c58c7数据ABCD 2018-01-02T10:14:55.285Z c18d142e-efa5-11e7-8671-7f3af13c58c7 MESSAGE_ID ABCD 2018-01-02T10:14:55.306Z c18d142e-efa5-11e7-8671-7f3af13c58c7推发送2018-01-02T10:14:55.345Z c18d142e-efa5-11e7-8671-7f3af13c58c7发电机成功:{“项目”:{“消息”:“ABCD”}} 2018-01-02T10:14:55.365Z c18d142e- efa5-11e7-8671-7f3af13c58c7数据ABCD 2018-01-02T10:14:55.366Z c18d142e-efa5-11e7-8671-7f3af13c58c7 MESSAGE_ID ABCD 2018-01-02T10:14:55.386Z c18d142e-efa5-11e7-8671-7f3af13c58c7推发送2018-01-02T10:14:55.406Z c18d142e-efa5-11e7-8671-7f3af13c58c7 push sent 2018-01-02T10:14:55.445Z c18d142e-efa5-11e7-8671-7f3af13c58c7 Dynamo Success:{“Item”:{ “消息”:“ABCD”}} 2018-01-02T10:14:55.445Z c18d142e-efa5-11e7-8671-7f3af13c58c7数据ABCD END RequestId:c18d142e-efa5-11e7-8671-7f3af13c58c7报告RequestId:c18d 142e-efa5-11e7-8671-7f3af13c58c7持续时间:10010.15 ms收费持续时间:10000 ms内存大小:128 MB最大使用内存:44 MB 2018-01-02T10:14:55.463Z c18d142e-efa5-11e7-8671-7f3af13c58c7任务在10.01秒后超时

lambda amazon-dynamodb
1个回答
0
投票

看起来你正试图获得具有键值"ind" : "ABC10"的项目并通知使用SNS。

在这种情况下,sns.publish应该成功调用getItem,而不是getmsg(MESSAGE_ID),应该调用sns publish function(即你需要创建一个来发布消息)或者应该执行sns publish code block(即只需复制并粘贴sns发布代码在getItem else部分内部阻止)。

我不明白你为什么要调用getmsg(错误)(即在getItem错误期间)或getmsg(MESSAGE_ID)(即getItem成功)?我认为这不正确。它基本上是在循环中调用getItem,导致超时错误。

© www.soinside.com 2019 - 2024. All rights reserved.