我在从 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 不能等待这么长时间的响应。可能是什么问题?
使用批量写入怎么样? 我认为使用下面的代码,然后你可以优化它。
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;
}
};