问题描述
我正在开发一个NodeJS服务,该服务连续轮询REST API,以近实时地获取大量资源的状态变化。没有其他协议可用。
轮询间隔为5秒。资源数量通常在100-500之间,因此请考虑:
- 通常它每秒执行50个HTTP请求
- 响应通常需要5秒钟以上,因此对同一请求的请求可能会重叠
通常,平均负载超过8.00(在8核vm中)和/或应用崩溃。
在处理此工作负载时,我想确保资源使用尽可能少。
这就是我所做的:
- HTTP2可用(但axios不支持吗?)
- 设置
process.env.UV_THREADPOOL_SIZE = 8
- 使用axios库发出异步请求
- 为所有请求重用同一axios实例
- 使用具有保持活动状态的HTTPSAgent
相关代码:
'use strict'
process.env.UV_THREADPOOL_SIZE = 8
const axios = axios.create({
baseURL: 'https://api.example.com',httpsAgent: new HTTPS.Agent({
keepAlive: true,//maxSockets: 256,//maxFreeSockets: 128,scheduling: 'fifo',timeout: 1000 * 15
}),timeout: 1000 * 15,})
loadResource(id){
return axios.request({
method: 'GET',url: `/resource/${id}`
})
.catch((err) => {
process.logger.error('Error with request (...)')
})
.then((res) => {
handle(res)
})
}
for(let id of [1,2,3,4,(...)]){
setInterval(() => loadResource(id),5000)
}
handle(res){...}
我正在考虑的事情:
- 在提出新请求之前等待答复(并寻求最佳方法来做到这一点)
还有什么可以做的以最佳方式处理请求?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)