首页 > 解决方案 > 为什么我在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 层吗?

标签: node.jsapiubuntugzipgunzip

解决方案


推荐阅读