AWS lambda Node.js

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

我在从 Node.js 编写的 Lambda 函数将数据保存到 DynamoDB 时遇到问题。我想问我的代码是否写得好,因为我每秒需要保存大约 100 个项目,而且我找不到其他方法从 Lambda 函数而不是 put 函数将数据保存到 DynamoDB。当我尝试保存大约 500 个项目(500 条记录)时,它会导致任务超时延迟。如果我保存大约 50 个项目,它有时会保存所有数据,但有时会保存大约 20 个项目,有时它不会保存任何内容。我的 lambda 代码:

var AWS = require("aws-sdk");
var dynamodb = new AWS.DynamoDB.DocumentClient();

var numberOfInsertedRows = 0;  
var actualInsertedRow = 0;

var insertItem = function(oneRow, context){
    var params = {};
    params.TableName = 'MyTable';
    params.Item = oneRow;

    dynamodb.put(params, function(err, data) {
        if (err) {
            console.log('ERROR');
            console.log(err);
            context.fail('some error');
        }
        else {
            actualInsertedRow++;
            if(actualInsertedRow == numberOfInsertedRows){
                console.log('All items saved');
                context.succeed('ok');
            }
        }
    });
};

exports.handler = function(event, context) {
    numberOfInsertedRows = event.length;
    actualInsertedRow = 0;

    event.forEach(function(item){
         insertItem(item, context);
    });
};

更新:现在我使用batchWriteItem,它在一批中限制为25条记录,因此我可以在for-each中使用它,当我有25个项目时,我会批量发送它们......但仍然存在持续时间较长的问题(putItem大约是4000 毫秒,批量约为 3500 毫秒,这对于仅插入大约 100 条记录来说非常糟糕)。我的 clientApp 不能等待这么长时间的响应。可能是什么问题?

node.js amazon-web-services lambda
1个回答
0
投票

使用批量写入怎么样? 我认为使用下面的代码,然后你可以优化它。

var AWS = require("aws-sdk");
var dynamodb = new AWS.DynamoDB.DocumentClient();

exports.handler = async function(event, context) {
    const tableName = 'MyTable';
    const batchSize = 25; // Batch size for batchWriteItem
    const batches = Math.ceil(event.length / batchSize);

    try {
        for (let i = 0; i < batches; i++) {
            const batch = event.slice(i * batchSize, (i + 1) * batchSize);
            await Promise.all(batch.map(item => {
                return dynamodb.put({
                    TableName: tableName,
                    Item: item
                }).promise();
            }));
        }
        console.log('All items saved');
        return 'ok';
    } catch (err) {
        console.error('Error saving items:', err);
        throw err;
    }
};
© www.soinside.com 2019 - 2024. All rights reserved.