Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在NodeJS中限制跨多个请求的函数调用?_Javascript_Node.js_Rest_Concurrency - Fatal编程技术网

Javascript 如何在NodeJS中限制跨多个请求的函数调用?

Javascript 如何在NodeJS中限制跨多个请求的函数调用?,javascript,node.js,rest,concurrency,Javascript,Node.js,Rest,Concurrency,我正在使用NodeJS运行后端服务器。后端拥有一个向外部API发出请求的函数。由于外部API提供程序对常量请求不太满意,因此我需要限制向该外部API发出请求的函数。我目前的解决方案是使用这个库 使用该库,我可以定义在一定时间内调用特定函数的频率限制(也可以限制执行特定函数的并发实例的数量)。只有一个缺点:我既不能访问也不能更改“等待”函数调用的队列,这意味着一个客户端基本上可以发出大量请求,并阻止其他客户端的函数 有没有一种方法可以在NodeJS中为函数调用实现队列排序?如果其他客户也提出请求,

我正在使用NodeJS运行后端服务器。后端拥有一个向外部API发出请求的函数。由于外部API提供程序对常量请求不太满意,因此我需要限制向该外部API发出请求的函数。我目前的解决方案是使用这个库

使用该库,我可以定义在一定时间内调用特定函数的频率限制(也可以限制执行特定函数的并发实例的数量)。只有一个缺点:我既不能访问也不能更改“等待”函数调用的队列,这意味着一个客户端基本上可以发出大量请求,并阻止其他客户端的函数

有没有一种方法可以在NodeJS中为函数调用实现队列排序?如果其他客户也提出请求,我需要考虑到这一点,并以某种方式混合执行顺序以再次公平(而不是先进先出/先到先得)

这是我当前设置的瓶颈,但如上所述,行为是FIFO,因此其他客户端被“阻止”


工作瓶颈不适合你的需要吗?当用户提交多个作业时,将其优先级提高到队列中当前作业的数量(直到9个)?好的,只有一种。在某些情况下,客户端可能会发出成百上千的请求,如果请求的数量如此之大,那么10种不同的优先级根本不足以分散负载,以防止客户端长时间阻塞功能。作业瓶颈提供的服务不适合您的需要吗?当用户提交多个作业时,将其优先级提高到队列中当前作业的数量(直到9个)?好的,只有一种。在某些情况下,客户端可能会发出成百上千的请求,如果请求的数量如此之大,那么10种不同的优先级根本不足以分散负载,从而防止客户端阻塞功能太长时间。
const Bottleneck = require("bottleneck");

const limiter = new Bottleneck({
  minTime: 1000,
});

router.post("/", async (req, res) => {
  ...
  const result = await requestHandler(xml, 0);
  async function requestHandler(xml, recursionCounter) {
    ...
    result = await limiter.schedule(() => soapRequest(URL, xml));
    ...
  }
}

async function soapRequest(url, xml) {...}