在Lambda和DAX中为DynamoDB扫描非常懒惰

时间:2018-03-15 19:01:49

标签: node.js lambda aws-lambda dax

我使用Lambda和DAX时出现问题。

在lambda中,没有Nodejs DAX clien,扫描平均时间是900ms但是如果我使用DAX,则它是4500ms。这很奇怪,因为如果我使用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.");

        }
    });
}

enter image description here

1 个答案:

答案 0 :(得分:1)

AWS Lambda使用可重复使用的容器。在第一次加载时,它是一个"初始化的容器"。第二次加载,直到它刷新(4小时?)它重新使用初始化的容器。它甚至可能会根据工作量进行扩展。

您需要在代码中掌握的技巧是不要在每次调用时重新初始化DynamoDb客户端。此AWS链接详细介绍了它:AWS Best Practices on AWS Service Client Initialization

因此,对于您的情况,请在函数处理程序范围之外设置客户端变量dax和daxclient。在C#中,我将它们声明在处理程序的范围之外,然后在处理程序中初始化它们,如果它们为null。如果不为null,我跳过初始化和重用。不知道nodejs的最佳实践是什么。