node.js - 为什么我在nodejs中解压.gz文件时服务器崩溃
问题描述
我创建了一个脚本,每 2 分钟运行 3 个不同的函数。每个函数都向同一个 API 发出请求,但每个函数都请求不同的数据。数据总是以压缩后的 xml 格式返回,所以我想出了如何将其转换为我想要使用的 JSON 格式,并且脚本运行良好。它很快,很少失败,当它失败时,它永远不会致命。
无论如何,当我在 VSCode 中运行脚本时,它运行良好并且所有 3 个函数都可以工作。每个人都向 API 发出请求,然后将数据转换为 JSON。但是,当我在我的 aws ec2 实例上运行脚本时,在解压缩 gzip 格式时,服务器总是在其中一个函数上崩溃。这是不断使服务器崩溃的功能...
const GetSmarketsData = () => {
const headers = {
"accept-charset" : "ISO-8859-1,utf-8;q=0.7,*;q=0.3",
"accept-language" : "en-US,en;q=0.8",
"accept" : "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"user-agent" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/537.13+ (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2",
"accept-encoding" : "gzip,deflate",
};
const options = {
url: API_URL,
headers: headers
};
const requestWithEncoding = (options, callback) => {
const req = request.get(options)
req.on('response', res => {
var chunks = []
res.on('data', chunk => {
chunks.push(chunk)
})
res.on('end', () => {
const buffer = Buffer.concat(chunks)
const encoding = res.headers['content-type']
if(encoding.includes('gzip')){
zlib.gunzip(buffer, (err, decoded) => {
callback(err, decoded && decoded.toString())
})
} else {
callback('Data error', buffer.toString())
}
})
})
req.on('error', err => {
callback(err)
})
}
requestWithEncoding(options, (err, data) => {
if(err){
console.log('err', err)
} else {
// this changes XML format to JSON format
parseString(data, (err, result) => {
if(err){
console.log('err', err)
} else {
console.log(result)
}
})
}
})
}
起初,服务器失败并出现此错误“Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory”所以我增加了内存分配使用...
node --max_old_space_size=1024 server.js
现在服务器刚刚到达这部分代码并使服务器崩溃。所有其他功能停止运行,没有任何反应。
zlib.gunzip(buffer, (err, decoded) => {
callback(err, decoded && decoded.toString())
})
所以我的问题是,有谁知道为什么会发生这种情况,我尝试为服务器分配多达 64gb 的内存,所以我不认为是这样。有什么我想念的吗?如果出现问题,服务器是 AWS ec2 上的免费 ubuntu 层吗?
解决方案
推荐阅读
- python - 当 score = 'r2_score' 时,sklearn 的 RidgeCV 的 cv.values 是什么意思?
- java - sparksql中用户定义函数(UDF)的scala到java转换
- multithreading - 创建一个线程使函数休眠而不冻结程序
- forms - 如何实时显示/隐藏元素(Blazor)?
- user-interface - GUI 动画 - Roblox Studio
- javascript - JS如何一举删除/停用/销毁所有方法、类、setTimouts和setIntervals?
- python - 无法打开文件'main.py':[Errno 2] 没有这样的文件或目录
- javascript - 可交互组件和随机函数的 Aframe 问题
- laravel - Laravel/Eloquent,动态检索数据(whereIn,sum)
- c++ - glfwInit() 冻结程序