2

さて、私はボットをホストしています。私が正気を保っているのは、私が今持っている唯一のものです。これは、音楽/チャット Web サイト用の IRC タイプのボットで、多くのことを行います。しかし、問題はそれらをオンラインに保つことです。以前は、すべてのボットを個別にforeverで起動する sh ファイルを使用していました。

cd dir/bots
forever start bot1.js
forever start bot2.js
...

などなど。そしてそれはうまくいきました。ただし、ボット自体は約 30 MB の RAM を使用しますが、forever プロセスも約 30 MB の RAM を使用します。私が実行していたのと同じくらい多くのボットで、RAM がほぼ限界に達していましたが、それは良くありませんでした。別のサーバーを取得する必要がある場合、状況は私にとって無限に複雑になるからです。正直に言うと、 、 私はこれがあまり得意ではありません。

そこで私はいくつかの調査を行い、child.fork()1 つの bot.js を使用して残りのボットを生成することにしました。そして、それは美しく機能し、RAMの使用量を以前の半分以下に減らしました. しかし今では、ボットをオンラインにしておくのは苦痛です。

var child = require("child_process");
var running = {};
var bots = ["bot1","bot2","bot3"];
for (var i=0;i<bots.length;i++) { 
    running[bots[i]] = child.fork("bots/"+bots[i]+".js");
};

私の質問は、これがこのセットアップを実行する最も効率的な方法ですか? それらは常にクラッシュしているため、私が何らかの手段で信頼できると見なされたい場合、それらはかなり自給自足である必要があり、私が眠っている夜の未明に停止するだけです.

現在、ノード スケジューラを使用して、ボットにメッセージを送信する偽の cron ジョブを作成しています (ボットがサービスに接続されている場合ではなく、js ファイルが実行されている限り返されるため、ノード メッセージではありません)。サービスから、ボットにコマンドを返させます。そして、ボットから 15 秒以内に応答がない場合は再起動するようにコマンドを設定します。しかし、常に機能しているわけではないようです。そして、私は途方に暮れています。

助けていただければ幸いです。できれば詳細をお知らせします。

4

2 に答える 2

0

私の解決策は、spawnノード内でプロセスを使用し、Promiseパターンを使用してプロセスの実行を同期し、結果を a で結合することですPromise.all(ここの関数を参照してくださいpromiseAll:

var promiseAll = function(items, block, done, fail) {
    var self = this;
    var promises = [],
        index = 0;
    items.forEach(function(item) {
        promises.push(function(item, i) {
            return new Promise(function(resolve, reject) {
                if (block) {
                    block.apply(this, [item, index, resolve, reject]);
                }
            });
        }(item, ++index))
    });
    Promise.all(promises).then(function AcceptHandler(results) {
        if (done) done(results);
    }, function ErrorHandler(error) {
        if (fail) fail(error);
    });
}; //promiseAll 

今インポートを行います

var cp = require('child_process');

各プロセスを生成する実行ブロックを記述します。

var ExecutionBlock = function(item, index, resolve, reject) {
        var options = [
            "--ssl-protocol", "tlsv1",
            "--ignore-ssl-errors", "true"
        ];
        options.push(executableFile); // push input file path
        options.push(item); // push executable arguments
        // LP: now spawn the power!
        var child = spawn(settings.executable, options);
        // Listen for an exit event:
        child.on('exit', function(exitCode) {
            console.log("Child exited with code: " + exitCode);
            return resolve(exitCode);
        });
        // Listen for stdout data
        child.stdout.on('data', function(data) {
            console.log(data.toString());
        });
        // child error
        child.stderr.on('data',
            function(data) {
                console.log('err data: ' + data);
                // on error, kill this child
                child.kill();
                return reject(new Error(data.toString()));
            }
        );

    } //ExecutionBlock

この時点で、実行可能ファイルの引数のリストにあるはずですが、次のアプローチinputItemsArrayでそれらを実行できます。Promise.All

// inputItemsArray is a list of arguments for the executable
promiseAll(inputItemsArray, function(item, index, resolve, reject) {
    ExecutionBlock(item, index, resolve, reject);
}
,function(results) { // aggregated results

    // all execution done here. The process exitCodes will be returned
    // array index is the index of the processed that exited
}
,function(error) { // error

});

完了ブロックは、終了コードを配列に集約しますresolve。このようにして、実行中のプロセスごとにexitCode、最終的なstdout、およびstderrそれらのそれぞれについて、実行を適切に制御できます。

Gist hereの実例。

于 2016-04-13T00:07:57.017 に答える
0

フリートをサブスタック別に見てみましょう。1 つのフリート ドローンで必要な数のプロセスを管理でき、クラッシュしたプロセスは自動的に再起動します。

フリートは、ハブと、ハブに接続された 1 つ以上のドローンをセットアップすることによって機能します。git を使用してコードをハブにプッシュします。ハブは、接続されているすべてのドローンに新しいバージョンのコードを自動的にデプロイします。その後、 を呼び出すことができますfleet spawn -- node foo.js。Fleet が実行を開始しnode foo.js、クラッシュした場合は foo.js を自動的に再起動します

于 2013-04-08T14:05:17.583 に答える