2016-07-08 6 views
0

IAMプログラミング対JAVA、以下のコンポーネントとのプロトタイプアプリケーション:cronジョブ(統計の生成を、やって管理者 アプリケーション(ウェブインターフェース+ cronジョブ+ HTTP-クライアント) - NODEJS

  • ため

    • ウェブインターフェース。私はnodejs(typescriptですとプログラミングを始めた)、私は他のサービスへの接続を持っ

    。)

  • は、HTTP経由で他のWebサービスと対話します。今、nodejのcron-jobに問題があります。 Iamは、クロムジョブを実行するためにnode-cronを使用しています。

    私は多くのPCのステータスを取得し、それを要約する必要があります。私はこれを行う場合、これはメインスレッドをブロックします。 私はこれを別のスレッドで行う必要があると思います。

    どうすればnodejsで対応できますか? webworker-threadsを使用する必要がありますか? 私は適切な方法でですか? これにはJava(Grails/Spring)を使うべきでしょうか? 私はnodejs(httpクライアントの場合)のシンプルさが大好きです。

    私は正しい方法で私に希望を与えることができます。

  • +0

    webservice呼び出しがNodeのメインスレッドをブロックすることが懸念されているように聞こえます... http://stackoverflow.com/a/14797359/311181を参照してください。 – chardy

    +0

    @chardy:完全に真実ではありません。 Node.jsでは、あなたのコードを除いてすべてが並行して実行されます。つまり、Node.jsで書いたすべてのI/Oコードは非ブロックであり、逆にNode.jsで書いた非I/Oコードはすべてブロックしています。 – Rudy

    +0

    よく私のニーズに合っているので、https://github.com/rschmukler/agendaを使うことに決めました。アジェンダとともに、nodejsのクラスタリングオプション(@Rudyで記述)を使用します。統計統計の生成に関する問題は、それを非ブロックにすることが難しいことです。たとえば、forを使っていくつかのデータを繰り返し処理すると、ブロックされます。 –

    答えて

    0

    Node Clusterを使用します。クラスタを使用すると、マスターは複数のワーカーを作成することができます。これは、あなたのクローンが着信要求をブロックしないことを意味します。ちょうど1人の労働者がCronをやっていることを確認してください。

    以前はnode-cronで作業していませんが、SyncedCronの経験があります。しかし同じでなければならない。

    httpクライアントには、これを行うライブラリがたくさんあります。Requestまたはhttpclientを確認できます。

    あなたのコードは次のようになります。

    var cluster = require('cluster'); 
    var http = require('http'); 
    var numWorkers = require('os').cpus().length-1; // just give 1 cpu for OS to use, or maybe 2 
    
    if (cluster.isMaster) { 
        console.log('Master cluster setting up ' + numWorkers + ' workers...'); 
        var cronPID=null; 
    
        for(var i = 0; i < numWorkers; i++) { 
        var worker=cluster.fork(); 
        if(i==0){ 
         //instructing the first worker to assume role of SyncedCron. 
         worker.send('you do it!'); 
         cronPID=worker.process.pid; 
         console.log("worker "+cronPID+" choosed as Cron worker!"); 
        } 
        } 
        cluster.on('online', function(worker) { 
         console.log('Worker ' + worker.process.pid + ' is online'); 
        }); 
        cluster.on('exit', function(worker, code, signal) { 
         // have to revive the worker 
         console.log('Worker ' + worker.process.pid + ' died with code: ' + code + ', and signal: ' + signal); 
         console.log('Starting a new worker'); 
         var newWorker=cluster.fork(); 
         if(cronPID==worker.process.pid) 
         { // need to re-elect a new cron worker! 
          newWorker.send('you do it!'); 
          cronPID=newWorker.process.pid; 
          console.log("worker "+cronPID+" choosed as Cron worker!"); 
         } 
        }); 
    }else 
    { // worker sides 
        process.on('message', (msg) => { 
         // validate your message that you get 
         // if validated, create a cron job here 
        }); 
        // create your express below, I assume you use express instead of node's http library 
        var express = require('express'); 
        var app = express(); 
        app.post........... 
    
    } 
    

    注:

    1. は、少なくとも、複数のコアを持つ必要があり、マスターを復活させる "forever"
    2. お使いのサーバーのようなものを使用するには4しかし、私はもっと(8多分?)をお勧めします。
    +0

    私は、自分のニーズに合っているので、https://github.com/rschmukler/agendaを使うことに決めました。アジェンダとともに、nodejsのクラスタリングオプション(@Rudyで記述)を使用します。統計統計の生成に関する問題は、それを非ブロックにすることが難しいことです。たとえば、forを使っていくつかのデータを繰り返し処理すると、ブロックされます。 –