You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何优化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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 05:15:30