如何通过同步互联网连接改进异步节点获取?
How to improve async node fetch with a synchronous internet connection?
我家里有高速同步光纤连接。速度非常适合流媒体和大型包裹。然而,由于连接开销,多个异步节点获取非常慢。我从来没有从本地主机获取超过 2 个异步数据。由于连接开销,每两次提取大约需要 1 秒。我需要超过一分钟的时间来处理大约 100 个异步提取。
通过我的 4g phone 作为热点,这需要不到 2 秒。
有什么方法可以捆绑同步互联网连接的抓取吗?
我运行这个节点为14的测试用例。
const fetch = require('node-fetch')
const promises = []
for(var i = 0; i < 100; i++) {
promises.push(fetch('https://geolytix.github.io/public/geolytix.svg'))
}
console.time('promise all')
Promise
.all(promises)
.then(arr => {
console.log(arr.length)
console.timeEnd('promise all')
})
.catch(error => {
console.error(error)
})
10 个超过 4g 需要 0.2 秒,100 个需要 1 秒。
在我的千兆线路上,10 个获取请求需要 4 秒,100 个需要 50 秒。
与axios.get()的行为完全一样
我能够通过使用自定义用户代理来获取节点来解决这个问题。自定义用户代理保持活动状态并具有 1 个 maxSockets。增加 maxSockets 将影响同步互联网连接的性能。
const https = require('https');
const httpsAgent = new https.Agent({
keepAlive: true,
maxSockets: 1
})
const options = {
agent: httpsAgent
}
const getPromise = () => new Promise(resolve=>{
fetch('https://geolytix.github.io/public/geolytix.svg', options)
.then(response => response.text())
//.then(text => console.log(text))
.then(() => resolve())
})
我家里有高速同步光纤连接。速度非常适合流媒体和大型包裹。然而,由于连接开销,多个异步节点获取非常慢。我从来没有从本地主机获取超过 2 个异步数据。由于连接开销,每两次提取大约需要 1 秒。我需要超过一分钟的时间来处理大约 100 个异步提取。
通过我的 4g phone 作为热点,这需要不到 2 秒。
有什么方法可以捆绑同步互联网连接的抓取吗?
我运行这个节点为14的测试用例。
const fetch = require('node-fetch')
const promises = []
for(var i = 0; i < 100; i++) {
promises.push(fetch('https://geolytix.github.io/public/geolytix.svg'))
}
console.time('promise all')
Promise
.all(promises)
.then(arr => {
console.log(arr.length)
console.timeEnd('promise all')
})
.catch(error => {
console.error(error)
})
10 个超过 4g 需要 0.2 秒,100 个需要 1 秒。
在我的千兆线路上,10 个获取请求需要 4 秒,100 个需要 50 秒。
与axios.get()的行为完全一样
我能够通过使用自定义用户代理来获取节点来解决这个问题。自定义用户代理保持活动状态并具有 1 个 maxSockets。增加 maxSockets 将影响同步互联网连接的性能。
const https = require('https');
const httpsAgent = new https.Agent({
keepAlive: true,
maxSockets: 1
})
const options = {
agent: httpsAgent
}
const getPromise = () => new Promise(resolve=>{
fetch('https://geolytix.github.io/public/geolytix.svg', options)
.then(response => response.text())
//.then(text => console.log(text))
.then(() => resolve())
})