在 Lambda 和 DAX 中为 DynamoDB 扫描的速度非常慢
Very lazy speed of scanning in Lambda and DAX for DynamoDB
我在使用 Lambda 和 DAX 时遇到问题。
在 lambda 中,如果没有 Nodejs DAX 客户端,扫描平均时间为 900 毫秒,但如果我使用 DAX,则为 4500 毫秒。这很奇怪,因为如果我使用 DAX,估计时间会比以前短。
这是最新代码。在这里我只得到一个记录,但它仍然是一样的。 )
const AWS = require('aws-sdk');
const AmazonDaxClient = require('amazon-dax-client');
const config = require('../config.json');
AWS.config.update({
region: config.region,
accessKeyId: config.accessKeyId,
secretAccessKey: config.secretAccessKey
});
var dax = null;
var daxClient=null;
const daxConfig = {
endpoints:[config.daxEndpoints],
region:config.region
}
if(dax == null & daxClient == null) {
console.log('initialized');
dax = new AmazonDaxClient(daxConfig);
daxClient = new AWS.DynamoDB.DocumentClient({service: dax });
}
exports.main = function(event, context, callback) {
context.callbackWaitsForEmptyEventLoop = false
const params = {
TableName: "game_dev"
};
daxClient.scan(params, function(err, data) {
if (err) {
console.log(JSON.stringify(err));
} else {
console.log("Query succeeded.");
}
});
}
AWS Lambda 使用可重复使用的容器。在第一次加载时,它是一个 "initialized container"。第二次加载直到它刷新(4 小时?)它重新使用初始化的容器。它甚至可以根据工作负载进行横向扩展。
您需要在代码中掌握的技巧是不要在每次调用时重新初始化 DynamoDb 客户端。此 AWS link 对此进行了更详细的介绍:AWS Best Practices on AWS Service Client Initialization
因此,对于您的情况,在函数处理程序的范围之外设置您的客户端变量 dax 和 daxclient。在 C# 中,我在处理程序的范围之外声明它们,如果它们为空,则在处理程序中初始化它们。如果不为空,我将跳过初始化和重用。不过不确定 nodejs 的最佳实践是什么。
我在使用 Lambda 和 DAX 时遇到问题。
在 lambda 中,如果没有 Nodejs DAX 客户端,扫描平均时间为 900 毫秒,但如果我使用 DAX,则为 4500 毫秒。这很奇怪,因为如果我使用 DAX,估计时间会比以前短。
这是最新代码。在这里我只得到一个记录,但它仍然是一样的。 )
const AWS = require('aws-sdk');
const AmazonDaxClient = require('amazon-dax-client');
const config = require('../config.json');
AWS.config.update({
region: config.region,
accessKeyId: config.accessKeyId,
secretAccessKey: config.secretAccessKey
});
var dax = null;
var daxClient=null;
const daxConfig = {
endpoints:[config.daxEndpoints],
region:config.region
}
if(dax == null & daxClient == null) {
console.log('initialized');
dax = new AmazonDaxClient(daxConfig);
daxClient = new AWS.DynamoDB.DocumentClient({service: dax });
}
exports.main = function(event, context, callback) {
context.callbackWaitsForEmptyEventLoop = false
const params = {
TableName: "game_dev"
};
daxClient.scan(params, function(err, data) {
if (err) {
console.log(JSON.stringify(err));
} else {
console.log("Query succeeded.");
}
});
}
AWS Lambda 使用可重复使用的容器。在第一次加载时,它是一个 "initialized container"。第二次加载直到它刷新(4 小时?)它重新使用初始化的容器。它甚至可以根据工作负载进行横向扩展。
您需要在代码中掌握的技巧是不要在每次调用时重新初始化 DynamoDb 客户端。此 AWS link 对此进行了更详细的介绍:AWS Best Practices on AWS Service Client Initialization
因此,对于您的情况,在函数处理程序的范围之外设置您的客户端变量 dax 和 daxclient。在 C# 中,我在处理程序的范围之外声明它们,如果它们为空,则在处理程序中初始化它们。如果不为空,我将跳过初始化和重用。不过不确定 nodejs 的最佳实践是什么。