有人能解释一下ENOBUFS错误吗?

13

我正在对一个包含大量数据的数据库进行多次调用,该数据库在Windows 7 64位操作系统上运行。由于这些调用正在排队,因此在第一个错误后,每个HTTP调用都会出现以下错误:

Error: connect ENOBUFS *omitted* - Local (undefined:undefined)
根据我的谷歌搜索,我了解到这个错误意味着我的缓冲区增长太大,我的系统内存无法处理缓冲区的大小。
但是我并不真正理解这意味着什么。我正在使用node.js和HTTPS库来处理请求。当请求被排队而套接字正在打开时,缓冲区的大小是否在RAM中分配?什么能够允许缓冲区扩展到更大的大小?这只是硬件限制吗?
我还读到一些操作系统能够更好地处理缓冲区的大小。这是真的吗?如果是这样,哪个操作系统更适合运行需要通过HTTPS请求获取大量数据的节点脚本?
以下是我的请求方式。
for (let j = 0; j < dataQueries; j++) {
 getData(function())
}

function getData(callback){
 axios.get(url, config)
   .then((res) => {
      // parse res 
      callback(parsedRes(res))
   }).catch(function(err) {
      console.log("Spooky problem alert! : " + err);
   })
}

为了简明起见,我省略了一些代码,但这通常是我处理请求的方式。我有一个for循环,每次迭代都会通过axios发出一个GET请求。

我知道有一个axios.all命令可用于存储axios.HTTPMethod返回的promise,但当我设置它以存储promise,然后通过axios.all迭代这些promise时,我的代码没有任何变化。


我们能看一下你的代码吗?我认为最好的解决方案是某种类型的队列。 - Jonas Wilms
1
还可以查看https://dev59.com/u2kv5IYBdhLWcg3wbgQx - Jonas Wilms
@Jonasw添加了一个简短的片段。你能否给我提供一个队列示例的链接或者给我设置它的一般思路? - A. Werner
关于child_process.spawnSync的相关内容,请参考:https://stackoverflow.com/questions/63796633/spawnsync-bin-sh-enobufs - undefined
4个回答

11

感谢@Jonasw的帮助,不过解决这个问题有一个非常简单的方法。 我使用了小型库throttled-queue来完成任务。(如果你查看源代码,用这个包实现自己的队列会很容易。)

我的代码改变为:

const throttledQueue = require('throttled-queue')

let throttle = throttledQueue(15, 1000) // 15 times per second

for (let j = 0; j < dataQueries; j++) {\
 throttle(function(){
   getData(function(res){
     // do parsing
   })
 }

}

function getData(callback){
 axios.get(url, config)
   .then((res) => {
      // parse res 
      callback(parsedRes(res))
   }).catch(function(err) {
      console.log("Spooky problem alert! : " + err);
   })
}

1
完美的,这足以减缓HTTP请求的速度,让Node和我的后端能够处理...谢谢! - cjones26

3
在我的情况下,解决这个问题的方法是从我的工作区中删除自动生成的zip文件。每次我执行“cdk deploy”命令时,都会创建这些文件。原来我的TypeScript编译器把这些文件当成源代码,并将它们计入tar包中。

0

你正在同时启动大量的数据查询。你可以使用部分递归函数将它们链接起来,以便它们一个接一个地执行:

(function proceedwith(j) {
   getData(function(){
     if(j<dataQueries-1) proceedwith(j+1); 
   });
})(0)

0

当启动过多请求时,遇到了相同的问题。

尝试使用throttled-queue,但它没有正常工作。

system-sleep 对我有用,有效地减缓了请求的速率。Sleep 最好在同步代码中使用,在使用同步/异步代码之前进行阻塞。

示例:(使用 sleep 限制调用 updateAddress() 的速率)

// Asynchronus call (what is important is that forEach is synchronous)
con.query(sql, function (err, result) {
    if (err) throw err;
    result.forEach(function(element) {
        sleep(120); // Blocking call sleep for 120ms
        updateAddress(element.address); // Another async call (network request)
    });
});

你能否详细说明一下你的解决方案是什么样子的,这样我们所有人都可以学习一下呢? - harmonica141

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接