【问题标题】:Read all the records in DynamoDB by a timely scan task通过定时扫描任务读取 DynamoDB 中的所有记录
【发布时间】:2018-09-06 03:11:03
【问题描述】:

假设我有一个包含足够项目的 DynamoDB,当我使用这个基本 Lambda 函数进行扫描时会引发超时异常:

var AWS = require('aws-sdk');
var dynamodb = new AWS.DynamoDB({apiVersion: '2012-08-10'});

exports.handler = function (event, context) {

    var tableName = "TABLE_NAEM";

    var params = {
        TableName : tableName,
        "ReturnConsumedCapacity": "TOTAL"
    };

    var counter = 1;

    dynamodb.scan(params, function(err, data) {
        if (err) {
            context.done('error', 'reading ddb failed: ' + err);
        }

        data.Items.forEach(function(element) {
            console.log(counter + "- " + element.whatever.S);
            counter++;
        })
    });

};

我想对表中的所有项目进行扫描,但我不想导致读取峰值。有没有办法将此 Lambda 函数作为任务运行,每隔 T 时间读取一次 N 项目,直到所有项目都被覆盖?

【问题讨论】:

  • Limit: N 在你的扫描参数中加上管理分页然后解决如何每T秒重新扫描的问题,也许使用setTimeout/setInterval。您需要保留响应 K 中的 LastEvaluatedKey 以填充请求 K+1 中的 ExclusiveStartKey。

标签: amazon-web-services aws-lambda amazon-dynamodb dynamodb-queries


【解决方案1】:

您可以使用 AWS Step Function 来帮助管理您的 Lambda 函数。 AWS Step Function 可以在 Lambda 调用之间休眠。您的 Lambda 可以返回 LastEvaluatedKey 并将其作为参数从 Step Function 接收。

【讨论】:

    【解决方案2】:

    所以有不同的方法来解决这个问题,我想我已经尝试了所有方法。 @cementblocks 建议的解决方案有效,但对于这样一个小问题来说有点矫枉过正,因为您需要处理所有回调失败,如果订单对您很重要,这不是一个可靠的选择。

    我最终将我的DynamoDB 导入到Redshift。它简单、可靠,一旦导入到Redshift,您就可以进行所有您想要的查询。

    这是 AWS wiki 页面中的 the related Docs

    【讨论】:

      猜你喜欢
      • 2016-01-16
      • 1970-01-01
      • 2016-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多