私はノード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
});
ありがとうフランク!私は10人以上の労働者を拡大することに対してなぜ助言を与えるのだろうと思っていますか?それはスケーリングがうまくいかない取引と関係がありますか?私は10+をスケールする必要があるかもしれませんが、私の主なボトルネックはCPU集約的な計算であり、Firebaseを実際に更新していないので、どういうわけかその部分をどこか別の場所に置くことができるかもしれません。 – Aretyper
ある時点で、すべてのワーカーが同じタスクキューを変更しているため、競合の問題が発生します。それはもちろん、操作のサイズに依存するので、ymmv。このような限界に達した場合は、代わりの作業配分システムを検討してください。競合が少なくなる可能性があるため、それほど民主的ではないもの(例:単一の作業流通サービス)がさらに拡大する可能性があります。 –
私は説明をありがとう、参照してください。あなたが気にしなければ、私はFirebaseにペイロードをプッシュするための単純なキューインプリメンテーションを書いています。キューに100項目の6つのプロセスを開始しました。ここに示すように、他の3人とのほぼすべての作業は、100個中2個のタスクしか取らないhttp://i.imgur.com/V1WwCI9.pngおそらくこれがなぜ起こっているのか知っていますか?それは私のコードに依存するのでしょうか、それともキューがどのように実装されているかの関数ですか?再度、感謝します。 – Aretyper