0

0

如何高效处理 5000+ 用户的异步 HTTP 请求与数据库写入?

心靈之曲

心靈之曲

发布时间:2026-01-10 15:24:02

|

548人浏览过

|

来源于php中文网

原创

如何高效处理 5000+ 用户的异步 HTTP 请求与数据库写入?

node.js 中批量发送数千条 http 请求(如通知)并写入数据库,属于典型的 i/o 密集型任务,**不应使用 worker threads**;应依托原生异步 i/o(如 `axios` + `promise.allsettled` + 并发控制)实现非阻塞、资源友好的批量处理。

Node.js 的“内置异步 I/O 操作”指其事件循环底层封装的非阻塞系统调用(如 libuv 管理的网络请求、文件读写、数据库连接等)。当你使用 axios、fetch、pg.query 或 mongoose.save() 时,实际触发的是异步系统调用,它们不会阻塞主线程,而是由事件循环在后台完成并触发回调或 Promise 解析——这正是 Node.js 高效处理 I/O 的核心机制。

而 Worker Threads 主要用于CPU 密集型任务(如图像处理、加密计算、大数据排序),其目标是将耗 CPU 的同步逻辑移出主线程,避免事件循环被冻结。对纯网络请求或数据库写入这类 I/O 操作,Worker Threads 不仅无法提升性能,反而因线程创建/通信开销(postMessage 序列化、上下文切换)导致整体吞吐下降。

你描述的场景(5000+ 用户:每用户插入 DB 记录 + 发送一次 Axios 请求)完全属于 I/O 密集型。正确做法是:

LALALAND
LALALAND

AI驱动的时尚服装设计平台

下载

使用并发控制 + 原生 Promise 异步流
避免 for...of + await 串行执行(太慢),也避免无限制 Promise.all()(易触发 API 限流或内存溢出)。推荐使用 p-limit 库或手动实现令牌桶限流:

import pLimit from 'p-limit';
import axios from 'axios';

const limit = pLimit(10); // 同时最多 10 个并发请求

async function sendBatchToUsers(users) {
  const promises = users.map(user =>
    limit(async () => {
      try {
        // 1. 写入数据库(假设使用 Prisma)
        await prisma.messageLog.create({
          data: { userId: user.id, status: 'pending' }
        });

        // 2. 发送 HTTP 请求
        const res = await axios.post('https://api.example.com/notify', {
          to: user.phone,
          message: 'Hello!'
        }, { timeout: 10000 });

        await prisma.messageLog.update({
          where: { userId: user.id },
          data: { status: 'success', response: JSON.stringify(res.data) }
        });

        return { success: true, userId: user.id };
      } catch (err) {
        await prisma.messageLog.update({
          where: { userId: user.id },
          data: { status: 'failed', error: err.message }
        });
        return { success: false, userId: user.id, error: err.message };
      }
    })
  );

  return Promise.allSettled(promises);
}

// 调用示例
const results = await sendBatchToUsers(all5000Users);
console.log(`成功: ${results.filter(r => r.status === 'fulfilled' && r.value.success).length}`);

⚠️ 注意事项:

  • 永远不要在循环中无节制 await:串行执行 5000 次请求可能耗时数小时;
  • 避免 Promise.all() 直接包裹全部请求内存占用高,且任一失败即中断全部;
  • 务必设置超时与重试策略(如 axios 的 timeout + retry-axios);
  • 配合外部 API 的速率限制:如上文示例中的 rateLimiter.pace() 可改造为基于 p-limit 的动态节流,或集成 bottleneck 库;
  • 数据库写入也需批处理优化:对 5000 条记录,优先考虑 prisma.$transaction 批量插入,而非逐条 create。

总结:面对万级 I/O 任务,Node.js 的答案从来不是“加线程”,而是“控并发 + 善用异步原语 + 尊重服务端约束”。Worker Threads 在此处不仅多余,更是反模式。

相关专题

更多
线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

479

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

479

2023.08.10

js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

510

2023.06.20

js获取当前时间
js获取当前时间

JS全称JavaScript,是一种具有函数优先的轻量级,解释型或即时编译型的编程语言;它是一种属于网络的高级脚本语言,主要用于Web,常用来为网页添加各式各样的动态功能。js怎么获取当前时间呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

244

2023.07.28

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

253

2023.08.03

js是什么意思
js是什么意思

JS是JavaScript的缩写,它是一种广泛应用于网页开发的脚本语言。JavaScript是一种解释性的、基于对象和事件驱动的编程语言,通常用于为网页增加交互性和动态性。它可以在网页上实现复杂的功能和效果,如表单验证、页面元素操作、动画效果、数据交互等。

5264

2023.08.17

js删除节点的方法
js删除节点的方法

js删除节点的方法有:1、removeChild()方法,用于从父节点中移除指定的子节点,它需要两个参数,第一个参数是要删除的子节点,第二个参数是父节点;2、parentNode.removeChild()方法,可以直接通过父节点调用来删除子节点;3、remove()方法,可以直接删除节点,而无需指定父节点;4、innerHTML属性,用于删除节点的内容。

475

2023.09.01

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

206

2023.09.04

c++主流开发框架汇总
c++主流开发框架汇总

本专题整合了c++开发框架推荐,阅读专题下面的文章了解更多详细内容。

25

2026.01.09

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 8.2万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 3.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号