【问题标题】:Very lazy speed of scanning in Lambda and DAX for DynamoDBDynamoDB 的 Lambda 和 DAX 扫描速度非常慢
【发布时间】:2018-03-15 19:01:49
【问题描述】:

我在使用 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.");

        }
    });
}

【问题讨论】:

  • 您为 Lambda 分配了多少 MB?只需检查您的平均评论,如果您一个接一个地调用 DynamoDb 调用是否需要 4500 毫秒?如果是这样,我可以查看整个 Lambda 函数吗?我很好奇的是您是否在每次调用时都实例化 DynamoDb 客户端,或者您是否正在初始化 DynamoDb 调用一次,然后每次调用都重用已经初始化的客户端...
  • 感谢您的回复。我将附上整个代码。
  • 128MB 内存用于 lambda。这是我使用的代码。是的。你是对的,它每次都通过 API Gateway 调用。如果您有任何想法,请帮助我。
  • 你好@Zaxxon,我怎样才能在每次调用时重用已经初始化的客户端?请让我知道该怎么做。谢谢
  • 进一步查看您的代码,“扫描”调用是一个缓慢的调用。 “扫描”的作用类似于“表扫描”,这意味着它将触及表中的每条记录。我建议使用“查询”,您可以通过“主分区键”进行查询。如果您需要按“主分区键”以外的字段进行搜索,您应该考虑其他选项,例如 ElasticSearch 等。您要做什么?是否允许用户在 game_dev 中的任何字段上进行搜索?

标签: node.js lambda aws-lambda dax


【解决方案1】:

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

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

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

【讨论】:

  • 嗨 Zaxxon,我是根据你的想法做到的。在函数范围之外设置 dax 和 daxclient。这样 daxclient var 现在就被初始化一次。但查询时间和以前一样。
  • 第一次运行很慢,因为“冷启动”问题。 (即初始化需要时间。)第二次调用它有多慢?
  • 嗨扎克森。我想再得到一个帮助。我不明白这张图的确切含义。你能用简短的作品解释一下吗?
  • 嗯,不知道。那些是 DynamoDb 图吗?小“我”对图表有什么看法?
猜你喜欢
  • 1970-01-01
  • 2016-10-15
  • 2012-05-27
  • 1970-01-01
  • 1970-01-01
  • 2016-06-16
  • 1970-01-01
  • 1970-01-01
  • 2015-11-23
相关资源
最近更新 更多