繁体   English   中英

查询和更新 dynamoDb 的最有效方法

[英]Most efficient way to query and update dynamoDb

我有一个 dynamo DB 表,用于存储失败的请求,稍后另一个 lambda 会想要读取请求并重新处理它们。

此刻我正在使用打字稿 CDK 创建这样的表

const myTable = new dynamodb.Table(this, "my-table", {
      tableName: "my-table-name",
      partitionKey: { name: "file_id", type: dynamodb.AttributeType.STRING },
    });

我在 python lambda 中像这样将数据发送到表中

dynamodb = boto3.resource("dynamodb", region_name=region)
my_table = dynamodb.Table("my-table-name")

failedRecord = {
        "file_id": str(file_id),
        "processed": "false",
        "payload": str(payload),
    }

    my_table.put_item(Item=failedRecord)

现在我想从另一个 lambda 中对表中的所有条目进行处理 = false 我想读取它们,对它们做一些事情,然后更新它们的处理 = true。

我是否需要在此处添加二级索引以提高效率。 如何做到这一点的例子会很棒。

谢谢

考虑创建一个包含未处理项目的全局二级索引。 您可以通过添加/删除 GSI 主键来添加/删除 GSI 中的项目。 例如,考虑以下表结构:

在此处输入图片说明

请注意,只有file_id 3 和 4 定义了 GSIPK。 GSI 在逻辑上看起来像这样:

在此处输入图片说明

DynamoDB 只会将项目投影到该项目上存在 GSIPK 的索引中。 你的 lambda 可以从 GSI 读取,做一些工作,将processed属性设置为true并删除GSIPK值。 这将有效地从二级索引中删除该项目。

为此对 DynamoDB 的update调用如下所示:

 const params = {
    TableName: YOUR_TABLE_NAME_HERE,
    Key: {
      PK: FILE_ID_HERE
    },
    UpdateExpression: "SET #processed = :true REMOVE #gsipk",
    ExpressionAttributeNames: {
      "#processed": "processed",
      "#gsi1pk": "GSIPK",
    },
    ExpressionAttributeValues: {
      ":true": true
    }
  };

  ddbClient.update(params);

假设您的filenote_id已经是唯一的(应该假设您已将其设置为分区键),使用您共享的记录格式和表架构 GSI 而不添加排序键不会有任何区别。

您可以考虑的另一种方法是为相关表启用DynamoDB Stream并将其设置为第二个 Lambda 函数触发器 使用这种方法,您基本上可以捕获表上的所有活动,并且在您的逻辑中,您可以过滤掉所有不是INSERT事件,并按照自己的节奏处理您感兴趣的事件。

这样你就可以避免完全查询表。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM