4

我正在设计一个守护进程(特别是 Heroku 的工作进程),并且我在 ram 使用中慢慢积累的代码。这是少量(100kb/10 秒),但我知道要长期使用此过程,最好保持 ram 使用率一致。我不熟悉创建旨在运行很长时间的流程,并且对于使用 Node 和 Javascript 开发应用程序仍然很陌生。这是我的大部分代码:

////////////////
// Queue Loop //
////////////////
var worker = (function() {
var buffer = "";
var couchdb = http.get({
    auth: db_user + ":" + db_pass,
    host: db_host, 
    path: '/queue/_all_docs?include_docs=true',
    port: db_port
}, function( response ) {
    response.setEncoding('utf8');

    response.on("data", function( data ) {
        buffer += data;
    });

    response.on("end", function() {         
        var queue = JSON.parse(buffer);

        if ( !queue.error ) {

            buffer = "";
            couchdb = http.get({
                auth: db_user + ":" + db_pass,
                host: db_host,
                path: '/flights/_all_docs?include_docs=true',
                port: db_port
            }, function( response ) {
                response.setEncoding('utf8');

                response.on("data", function(data) {
                    buffer += data;
                });

                response.on("end", function() {
                    var flights = JSON.parse(buffer);

                    if ( !flights.error ) {
                        for ( row in queue.rows ) {
                            console.log(queue.rows[row].doc.flight);
                        }

            for ( row in flights.rows ) {
                console.log(flights.rows[row].doc.program);
                }

                setTimeout( worker, 10000 );    
            } else {
                // db error
            }
            });
        }).on("error", function() {
            setTimeout( worker, 10000 );    
        });
            } else {
                // db error
            }
        });
    }).on("error", function() {
        console.error("CouchDB is currently not available.");
        setTimeout( worker, 10000 );
    });
});



///////////////
// Run Queue //
///////////////
(function() {
    worker();
})();

那么,让这样的程序在相同数量的 ram 下不断运行的最佳方法是什么?还有哪些其他设计考虑因素对于保持其运行良好以充当 Heroku 上的工作进程至关重要?

哦,至于它的作用,它从 CouchDB 实例中提取一些条目,然后根据这些条目运行预测。

4

1 回答 1

3

事实证明,Node.js 提供了一个很好的函数process.nextTick()来清除调用堆栈(编辑:这可能不是这种情况,但它有助于积累)。通过将我对 worker 的所有调用都包含在其中,我可以防止理论上的堆栈溢出(这没有发生,但我的内存使用量一直在增长)。

我对这个功能的理解不是很深,但是它做了我一直想做的事情。

(编辑:原来节点通过 V8 进行了 FANTASTIC 垃圾收集,但它以奇怪的间隔运行!)

阅读:

于 2012-07-12T02:33:45.927 回答