簡體   English   中英

並行列出和刪除 DynamoDB 中的數據

[英]Listing and Deleting Data from DynamoDB in parallel

我正在使用 Lambdas 和 SQS 隊列從 DynamoDB 中刪除數據。 早些時候,當我開發這個時,我發現從 DyanmoDB 中刪除數據的唯一方法是收集要刪除的數據並批量刪除它們。 在我目前的組織中,大部分基礎設施都是無服務器的。 因此,我決定讓這篇文章也遵循無服務器和事件驅動的架構。 簡而言之,我在 SQS 隊列上發布一條消息以刪除特定分區下的項目。 一旦此消息調用我的 Lambda,我對 DyanmoDB 執行 1000 個項目的列表調用並執行以下操作:

  • 從此列表調用中獲取 cursor,然后發布另一條消息以從此 cursor 中獲取下 1000 個項目。
import {  DynamoDBClient } from '@aws-sdk/client-dynamodb';
const dbClient = new DynamoDBClient(config);
const records = dbClient.query(...fetchFirst1000ItemsForPrimaryKey);
postMessageToFetchNextItems();
  • 從獲取的 1000 個項目中:
    • 我創建了一批 20 個項目,並為另一個 lambda 發出一組消息以刪除這些項目。 一批 20 個項目被過帳刪除,直到所有 1000 個項目都被過帳刪除。

       for (let i = 0; i < 1000; i += 20) { const itemsToDelete = records.slice(i, 20); postItemsForDeletion(itemsToDelete); }
  • 另一個 lambda 獲取這些項目並刪除它們:
dbClient.send(new BatchWriteItemCommand([itemsForDeletion]))
  • 列表 lambda 接收到從下一個 cursor 讀取項目的調用,並重復上述步驟。

這一切都是並行發生的。 獲取項目,發布消息以獲取下一個 1000 個項目,發布消息以刪除項目。

雖然在紙面上看起來不錯,但這似乎並沒有從 DynamoDB 中刪除所有記錄。 沒有固定的模式,DynamoDB 中總是有一些項目。 我不完全確定會發生什么,但有一個理論認為並行刪除和列出可能是導致問題的原因? 我無法找到任何文件來驗證我的理論,因此這里的這個問題。

批量寫入項目調用將返回未處理項目的列表。 您應該檢查並重試它們。

查看https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/clients/client-dynamodb/classes/batchwriteitemcommand.html的文檔和搜索UnprocessedItems的文檔。

從根本上說,批量寫入項目調用不是事務性寫入。 某些項目寫入可能成功,而其他項目寫入失敗。 檢查失敗並重試它們是你的責任。 對不起,我沒有好的示例代碼的鏈接。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM