![](/img/trans.png)
[英]Boto3 DynamoDB: Most Efficient way to query "key" not begins with "SomeValue"
[英]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.