barretlee / Node-Daily-Practice

每天写个小程序。
https://github.com/barretlee/Node-Daily-Practice/issues
MIT License
30 stars 2 forks source link

Day5 父子进程的通讯和控制 #6

Open barretlee opened 9 years ago

barretlee commented 9 years ago

定时跑一个程序,这个程序会发送很多网络请求,挂掉的可能性是很大的,如果只是在程序内做些容错控制,内存会暴涨,也不方便对错误做梳理。

现打算,使用 Master 来控制多个 Child,Child 进程挂了之后,Master 重新启动,Child 不做过多的错误处理,出了问题就重来,大的任务分解成小任务,通过 Master 来分发管理。

barretlee commented 9 years ago
var child_process = require('child_process');

// deamon
function spawn(mainModule) {
    var worker = child_process.spawn('node', [ mainModule ]);

    worker.on('exit', function (code) {
        if (code !== 0) {
            setTimeout(function(){              
                spawn(mainModule);
            }, 1000 * 60 * 5);
        }
    });
    // worker.stdout.setEncoding('utf8');
    // worker.stdout.on('data', function (data) {
    //  console.log(data);
    // });
    worker.stderr.setEncoding('utf8');
    worker.stderr.on('data', function (data) {
        console.log(data);
    });
}

var timer = null;
function t(){
    spawn("./collect.js");

    clearTimeout(timer);
    timer = setTimeout(function(){
        t();
    }, 24 * 60 * 60 * 1000);
}
barretlee commented 9 years ago
// collect.js 片段
function getLog(st){
    var et = st + delta;
    var url = API + querystring.stringify({
        st: st,
        et: et
    });

    return new Promise(function(resolve, reject){
        http.get(url, function(res){
            // debug(url);
            var body = [], len = 0;
            res.on("data", function(chunk){
                body.push(chunk);
                len += chunk.length;
            });
            res.on("end", function(){
                body = Buffer.concat(body, len).toString();
                try{
                    body = JSON.parse(body);
                } catch(e){
                    console.log("估计请求太汹涌,服务器502了。");
                    process.exit(1);
                }

                if(body.msg != "ok"){
                    reject("Request Error: " + url);
                    return;
                }
                formatData(body);
                delete body;
                resolve();
            });
        }).on("error", function(err){
            reject(err);
        });
    });
}