DynamoDB 响应缓慢

gab*_*jan 7 amazon-web-services amazon-dynamodb

所以我的问题是 DynamoDB 需要相当长的时间来返回单个对象。我正在使用 node.js 和 AWS docclient。奇怪的是,从数据库中“选择”单个项目需要 100 毫秒到 200 毫秒。有没有办法让它更快?

示例代码:

var AWS = require("aws-sdk");
var docClient = new AWS.DynamoDB.DocumentClient();
console.time("user get");
var params = {
      TableName : 'User',
      Key: {
        "id": "2f34rf23-4523452-345234"
      }
    };

    docClient.get(params, function(err, data) {
        if (err) {
            callback(err);
        }
        else {              
            console.timeEnd("user get");
        }
    });
Run Code Online (Sandbox Code Playgroud)

lambda 中这段简单代码的平均时间是 130 毫秒。知道我能做些什么来让它更快吗?用户表只有主分区键“id”和带有主键电子邮件的全局二级索引。当我从控制台尝试此操作时,它需要更多时间。

任何帮助都感激不尽!

Rom*_*siy 8

我在使用 Lambda@Edge 时遇到了完全相同的问题。来自 DynamoDB 的响应平均需要 130-140 毫秒,而 DynamoDB 延迟图显示了 10-20 毫秒的延迟。

通过禁用 ssl、参数验证和 convertResponseTypes,我设法将响应时间平均缩短到约 30 毫秒:

const docClient = new AWS.DynamoDB.DocumentClient({ 
  apiVersion: '2012-08-10',
  sslEnabled: false,
  paramValidation: false,
  convertResponseTypes: false
});
Run Code Online (Sandbox Code Playgroud)

问题的原因很可能是 lambda 本身的 CPU/网络节流。用于查看器请求的 Lambda@Edge 最多可以有 128MB,这是一个非常慢的 lambda。因此禁用额外检查和 SSL 验证使事情变得更快。

如果您只运行常规 Lambda,增加内存应该可以解决问题。


Ale*_*kis 1

预热了 Lambda 函数吗?如果您只是临时运行它,而不是运行连续负载,则该功能可能在运行它的容器上尚不可用,因此可能需要额外的时间。支持或反驳这一理论的一种方法是查看 GetItem API 的延迟指标。最后,您可以尝试使用AWS X-Ray来查找堆栈中的其他延迟点。

DynamoDB SDK 也可能会重试,从而增加您在 Lambda 函数中感知到的延迟。鉴于您的项目约为 10 KB,您可能会受到限制。您是否配置了足够的读取容量?您可以在 DynamoDB 控制台中验证表的读取延迟和读取限制指标。