1

我正在使用 lambda 触发器来检测插入DynamoDB表(推文)。一旦触发,我想在事件中获取消息,并使用Comprehend获取它的情绪。然后,我想根据情绪更新第二个DynamoDB表 (SentimentAnalysis),其中我 ADD + 1 为一个值。

如果我手动插入单个项目,这可以正常工作,但我希望能够使用Twitter API将批量数据插入到我的DynamoDB表中,并分析每条推文的情绪。如果 Twitter 参数中指定的计数 <= 5,则 lambda 函数可以正常工作,但上述任何内容都会导致 SentimentAnalysis 表中的更新出现问题,而是触发器不断重复自身,没有任何进展或停止的迹象。

这是我的 lambda 代码:

let AWS = require("aws-sdk");

let comprehend = new AWS.Comprehend();

let documentClient = new AWS.DynamoDB.DocumentClient();

exports.handler = (event, context) => {

    event.Records.forEach(record => {

        if (record.eventName == "INSERT") {

            //console.log(JSON.stringify(record.dynamodb.NewImage.tweet.S));

            let params = {
                LanguageCode: "en",
                Text: JSON.stringify(record.dynamodb.NewImage.tweet.S)
            };



            comprehend.detectSentiment(params, (err, data) => {
                if (err) {
                    console.log("\nError with call to Comprehend:\n " + JSON.stringify(err));
                } else {
                    console.log("\nSuccessful call to Comprehend:\n " + data.Sentiment);


                    //when comprehend is successful, update the sentiment analysis data
                    //we can use the ADD expression to increment the value of a number
                    let sentimentParams = {
                        TableName: "SentimentAnalysis",
                        Key: {
                            city: record.dynamodb.NewImage.city.S,
                        },
                        UpdateExpression: "ADD " + data.Sentiment.toLowerCase() + " :pr",
                        ExpressionAttributeValues: {
                            ":pr": 1
                        }
                    };


                    documentClient.update(sentimentParams, (err, data) => {
                        if (err) {
                            console.error("Unable to read item " + JSON.stringify(sentimentParams.TableName));
                        } else {
                            console.log("Successful Update: " + JSON.stringify(data));
                        }
                    });


                }


            });

        }
    });
};

这是成功通话的图像,它适用于前几条推文

这是在第一张图像之后的不成功调用。请求总是超时

4

1 回答 1

2

超时是它反复发生的原因。如果 lambda 超时或以其他方式出错,它将导致批次被重新处理。您需要处理此问题,因为交付是“至少一次”。您还需要找出超时的原因。它可能像小批量一样简单,或者使用阶跃函数的更复杂的解决方案。您可能只能增加 lambda 的超时时间。

于 2020-02-25T18:28:08.110 回答