2017-02-05 11 views
1

私はノードjsアプリケーションでクラスタリングを有効にしようとしています。現在、私はそれを有効にするには、このスニペットを使用します。ノードjsクラスタリングは8つのプロセスすべてで同じタスクを繰り返しています

var cluster = require('cluster'); 

if (cluster.isMaster) { 
    // Count the machine's CPUs 
    var cpuCount = require('os').cpus().length; 

    // Create a worker for each CPU 
    for (var i = 0; i < cpuCount; i += 1) { 
    cluster.fork(); 
    } 

    // Listen for dying workers 
    cluster.on('exit', function() { 
    cluster.fork(); 
    }); 
} 

そして、基本的に私のコードが実行するには、条件に基づいてFirebaseデータベースに書き込みます。問題は、1回の書き込みタスクを処理している1人の作業者ではなく、書き込みがそれぞれ8回発生していることです。すべてのスレッドがすべてのタスクを実行しているようです。これを避ける方法はありますか?もしそうなら、誰かがこれに関するいくつかのリソースの方向に私を指摘することができますか?私は、ノードjsクラスタリングでFirebaseを使用している場合、Google上で何も見つけることができません。

ref.child('user-sent').on('child_added', function(snapshot) { 

      var message = snapshot.child('message'); 

      payload['user-received/'] = message; 

      ref.update(payload); // this occurs once for each fork so it updates 8 times 
    }); 

答えて

1

あなたは8つのスレッドを生成しているし、各スレッドが同じ場所(user-sent)上のリスナーを添付した場合は、各:ここに道に私の機能の1つの作業の例(refが私のfirebase参照である)がありますスレッドは、その場所にある各子のchild_addedイベントを発生させます。これは予想される動作です。

user-sentの下の各ノードが1つのスレッドのみで処理されるワーカーキューを実装する場合、1つのスレッドで各ノードを要求できるようにする作業分散メカニズムを使用する必要があります。

firebase-queue libraryは、Firebaseデータベーストランザクションを使用して、このような作業主張の仕組みを実装しています。これは小規模から中規模の労働者に拡大するために使用されています(数十ではなく、<と考える)。

+0

ありがとうフランク!私は10人以上の労働者を拡大することに対してなぜ助言を与えるのだろうと思っていますか?それはスケーリングがうまくいかない取引と関係がありますか?私は10+をスケールする必要があるかもしれませんが、私の主なボトルネックはCPU集約的な計算であり、Firebaseを実際に更新していないので、どういうわけかその部分をどこか別の場所に置くことができるかもしれません。 – Aretyper

+0

ある時点で、すべてのワーカーが同じタスクキューを変更しているため、競合の問題が発生します。それはもちろん、操作のサイズに依存するので、ymmv。このような限界に達した場合は、代わりの作業配分システムを検討してください。競合が少なくなる可能性があるため、それほど民主的ではないもの(例:単一の作業流通サービス)がさらに拡大する可能性があります。 –

+0

私は説明をありがとう、参照してください。あなたが気にしなければ、私はFirebaseにペイロードをプッシュするための単純なキューインプリメンテーションを書いています。キューに100項目の6つのプロセスを開始しました。ここに示すように、他の3人とのほぼすべての作業は、100個中2個のタスクしか取らないhttp://i.imgur.com/V1WwCI9.pngおそらくこれがなぜ起こっているのか知っていますか?それは私のコードに依存するのでしょうか、それともキューがどのように実装されているかの関数ですか?再度、感謝します。 – Aretyper

関連する問題