首页 > 解决方案 > nodejs express为繁重的路由/功能添加全局队列/节流并行执行

问题描述

在 node.js express 服务器上,我们有一个繁重的功能,它应该同时运行 X 次(占用太多 RAM)。有没有这方面的库/实现?

寻找类似于function-rate-limit的东西,但不是按时间限制,而是按全局并行执行限制。

其他呼叫应该排队,最好的情况是请求的时间限制为 30 秒。

我的第一个快速天真的实现是这样的:

function limitParallel(fn, maxParallel, ctx) {
  const waitSomeMs = (ms) => new Promise((res) => setTimeout(res, ms));

  let running = 0;
  return async function() {
    while (running > maxParallel) {
      await waitSomeMs(100);
    }
    running++;
    const result = await fn.apply(ctx || this, arguments)
    running--;
    return result;
  }  
}
    
// usage example
const heavyFn = () => new Promise((res) => setTimeout(res, 1000)).then(() => console.log('heavy done' + new Date()));
const limited = limitParallel(heavyFn, 2);

limited();
limited();
limited();
limited();
limited();
limited();
limited();

//only 2 console.logs at second

但是一些定性的库/实现会更好,因为这里有轮询和没有先进先出。

更新:

我找到的第一个解决方案:express-queue。谢谢@ikhvjs

标签: javascriptnode.jsexpressthrottlingrate-limiting

解决方案


推荐阅读