如何优化AWS DynamoDB百万数据批量插入的JavaScript性能
优化DynamoDB批量插入100万条数据的性能方案
针对你当前同步执行批量插入导致速度慢的问题,以下是几个直接有效的优化思路:
1. 并发执行批量请求(核心优化)
原代码每次仅发送一个批量请求,完全串行执行,浪费了DynamoDB的吞吐量。可以通过限制并发数的方式并行发送多个批量请求,同时避免超出表的吞吐量限制(并发数可根据表的配置调整,建议从50开始测试)。
修改后的代码示例:
const documentClient = new DynamoDB.DocumentClient(); const MAX_CONCURRENCY = 50; // 可根据表的实际吞吐量调整 export class DatabaseHandler { static batchWriteItems = async (tableName: string, data: {}[]) => { // 分块处理数据,避免修改原数组 const chunks = []; for (let i = 0; i < data.length; i += 25) { chunks.push(data.slice(i, i + 25)); } // 单批次执行逻辑 const executeBatch = async (chunk: {}[]) => { const putRequests = chunk.map(elem => ({ PutRequest: { Item: elem } })); const params = { RequestItems: { [tableName]: putRequests } }; // 处理未完成的请求(含重试逻辑) await this.processBatchWithRetry(params); }; // 分批并发执行,控制并发上限 for (let i = 0; i < chunks.length; i += MAX_CONCURRENCY) { const currentBatch = chunks.slice(i, i + MAX_CONCURRENCY); await Promise.all(currentBatch.map(chunk => executeBatch(chunk))); } } // 处理批量请求的重试逻辑,针对UnprocessedItems static processBatchWithRetry = async (params: any) => { let unprocessed = params.RequestItems; do { const response = await documentClient.batchWrite({ RequestItems: unprocessed }).promise(); unprocessed = response.UnprocessedItems; // 存在未处理项时,随机短延迟后重试(指数退避简化实现) if (Object.keys(unprocessed).length > 0) { await new Promise(resolve => setTimeout(resolve, 100 * Math.random())); } } while (Object.keys(unprocessed).length > 0); } }
2. 处理UnprocessedItems(避免丢数据+提升有效吞吐量)
DynamoDB的batchWrite在吞吐量不足时会返回UnprocessedItems,原代码完全忽略了这部分,不仅可能导致数据丢失,也会浪费请求机会。上述代码加入了重试逻辑,确保所有项目都被插入,同时用随机退避避免加剧拥堵。
3. 临时调整表的吞吐量
如果你的表是预配置吞吐量模式,可以临时提高写入容量单位(WCU):
- 你的单条数据仅含3-5个数字ID,大小远小于1KB,1个WCU每秒可处理10次这类写入请求。
- 100万条数据按25条一批共4万批,若要在5分钟内完成,需每秒处理约133批,对应配置约133 WCU(可预留冗余)。
- 插入完成后记得调回原WCU数值,避免不必要的费用。
若使用按需模式,DynamoDB会自动扩容,但可能存在短暂预热时间,成本略高于预配置模式。
4. 替换性能较差的splice操作
原代码用data.splice(0,25)修改原数组,在大数据量下性能损耗明显,改用slice分块可避免修改原数组,同时提升处理效率。
5. 改用AWS SDK v3(可选)
AWS SDK v3采用模块化设计,性能优于v2,且内置了重试和并发控制工具,比如@aws-sdk/lib-dynamodb的批量写入工具类,可简化代码并进一步提升效率。
内容的提问来源于stack exchange,提问作者Tiago Silva
相关产品推荐
相关产品推荐

