在单个查询中将多个JSON对象插入Dynamo DB

Vip*_*rma 2 node.js amazon-dynamodb aws-lambda serverless

我的设置-AWS Lambda,AWS Dynamo DB,nodejs和无服务器。

我正在从某些API获取JSON对象数组,并尝试将其插入我的Dynamo DB中。到目前为止,我唯一的解决方案是遍历数组,并对每个对象进行DocumentClient()PUT调用。
我的数据大约有1000个对象,并且写入吞吐量设置为1。因此,即使在插入约300条记录并出现此错误后,该解决方案也对我失败-The level of configured provisioned throughput for the table was exceeded.

可以在单个查询中完成吗?

nac*_*oab 6

插入每个项目将消耗1 WCU(每KB),没有其他方法。

可以使用更有效的batchWrite代替单个插入。但是,仍然需要根据表写入吞吐量来调整插入率。

另外,请注意,插入开始时使用的是300秒的突发容量(您的前300次插入),但是在消耗掉这些插入之后,您只能使用1个WCU进行1次写入/秒。

这是一个批处理插入的示例,该批处理将在块之间等待并重新安排失败的插入:

async function batchedAsync({list, callback, chunkSize=10, msDelayBetweenChunks=0}) {
  const emptyList = new Array(Math.ceil(list.length / chunkSize)).fill();
  const clonedList = list.slice(0);
  const chunks = emptyList.map(_ => clonedList.splice(0, chunkSize));
  for (let chunk of chunks) {
    if (msDelayBetweenChunks) {
      await new Promise(resolve => setTimeout(resolve, msDelayBetweenChunks));
    }
    await callback(chunk, chunks);
  }
}

async function writeItems(chunk, chunks) {
  const {UnprocessedItems} = await documentClient.batchWrite({
    RequestItems: {
      TableName: chunk.map(item => {
        return {PutRequest: {Item: item}};
      })
    }
  }).promise();
  if (UnprocessedItems.length) {
    chunks.push(UnprocessedItems);
  }
}

// Example
batchedAsync({
  list: itemsToInsert,
  callback: writeItems,
  chunkSize: 2, // adjust to provisioned throughput. Max 25 (batchWrite dynamodb limit)
  msDelayBetweenChunks: 1000
});
Run Code Online (Sandbox Code Playgroud)