簡體   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