在 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 的最佳实践是什么。