My setup - AWS Lambda, AWS Dynamo DB, nodejs and serverless.
我正在从某个 API 获取 JSON 对象数组并尝试将它们插入我的 Dynamo 数据库中。到目前为止,我得到的唯一解决方案是遍历数组并为每个对象进行 DocumentClient(( PUT 调用。
我的数据有大约 1000 个对象,写入吞吐量设置为 1。因此,在插入大约 300 条记录并出现此错误后,即使该解决方案对我来说也失败了 - The level of configured provisioned throughput for the table was exceeded.
可以在单个查询中完成吗?
每个项目插入将消耗 1 个 WCU(每 KB(,没有其他方法。
您可以使用更高效的批处理写入,而不是单个插入。但是,您仍然需要根据表写入吞吐量调整插入速率。
另外,请注意,您的插入在开始时使用 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(tableName, 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.bind(null, myTableName),
chunkSize: 2, // adjust to provisioned throughput. Max 25 (batchWrite dynamodb limit)
msDelayBetweenChunks: 1000
});