Лямбда-триггер не работает должным образом с объемными данными - PullRequest
1 голос
/ 25 февраля 2020

Я использую лямбда-триггеры для обнаружения вставки в таблицу DynamoDB (твиты). После запуска я хочу взять сообщение в событии и получить настроение для него, используя Comprehend . Затем я хочу обновить вторую DynamoDB таблицу (SentimentAnalysis), где я добавляю +1 к значению, зависящему от настроения.

Это работает нормально, если я вручную вставляю один элемент, но я хочу иметь возможность использовать Twitter API для вставки массовых данных в мою таблицу DynamoDB и анализировать каждый твит на предмет его настроений. Лямбда-функция работает нормально, если счетчик, указанный в параметрах Twitter, равен <= 5, но все вышеперечисленное вызывает проблему с обновлением в таблице SentimentAnalysis, и вместо этого триггер продолжает повторяться без признаков прогресса или остановки. </p>

Это мой лямбда-код:

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));
                        }
                    });


                }


            });

        }
    });
};

Это изображение успешного вызова, оно работает с первыми несколькими твитами

Это неудачный звонок сразу после первого изображения. Время запроса истекло

1 Ответ

2 голосов
/ 25 февраля 2020

Тайм-аут, почему это происходит неоднократно. Если лямбда-тайм-аут истечет или произойдет другая ошибка, это приведет к повторной обработке партии. Вы должны справиться с этим, потому что доставка «как минимум один раз». Вы также должны выяснить причину тайм-аута. Это может быть так же просто, как более мелкие партии или более сложное решение с использованием пошаговых функций. Вы можете просто увеличить время ожидания лямбды.

...