async处理JSON数据入库最佳实践:如何实现多用户数据并行处理
性能优化实现方案
核心优化思路
- 将每个用户的完整处理流程(创建用户 + 创建用户关联元数据)封装为独立的异步任务
- 所有用户的异步任务通过
Promise.all并行执行,不同用户的处理流程互不阻塞,满足「无需等待前一个用户全部处理完成再处理下一个用户」的要求 - 单个用户内部,先执行
createUser拿到用户ID后,再并行执行该用户所有的createUserMeta任务,进一步缩短单用户处理耗时
优化后代码
const data = [{ id: 1, name: 'foo', items: [{ name: 'foo-1' }, { name: 'foo-2' }] }, { id: 2, name: 'bar', items: [{ name: 'bar-1' }, { name: 'bar-2' }] }] const createUser = (data) => { console.log('start create user:', data) return new Promise(resolve => { setTimeout(() => { console.log('create user: ', data.name) resolve(data.id); }, 2000); }); } const createUserMeta = (id, name) => { console.log('start create user meta:', name) return new Promise(resolve => { setTimeout(() => { console.log('create user meta: ', id, name) resolve(`set ${id}: ${name}`) }, 3000) }) } // 封装单个用户的完整处理流程 async function processSingleUser(user) { const userId = await createUser(user); // 并行处理当前用户的所有meta任务,如需串行可替换为循环await const metaResults = await Promise.all( user.items.map(item => createUserMeta(userId, item.name)) ); return metaResults; } // 主逻辑 async function asyncCall() { console.log('calling'); // 并行执行所有用户的处理任务 const allResults = await Promise.all(data.map(user => processSingleUser(user))); // 扁平化结果数组,和原实现输出格式完全一致 const result = allResults.flat(); console.log(result); } asyncCall();
效果说明
优化后严格满足业务约束:同用户的createUserMeta一定会等待该用户的createUser执行完成后才启动,同时不同用户的处理流程完全并行。
- 原实现总耗时为16秒,优化后总耗时仅为5秒(2秒并行创建所有用户 + 3秒并行创建所有用户的元数据)
- 如业务要求单个用户的
createUserMeta必须串行执行,仅需把processSingleUser内的Promise.all部分替换为原有的循环await逻辑即可,总耗时仍可缩短至8秒,相比原实现仍有50%的性能提升。
内容的提问来源于stack exchange,提问作者Centell
相关产品推荐
相关产品推荐

