Rumah > Artikel > hujung hadapan web > Mari kita bincangkan tentang modul Nodejs-cluster dan perkenalkan cara menggunakannya.
Artikel ini akan membawa anda melalui modul Nodejs-cluster dalam nod dan memperkenalkan penggunaan modul Nodejs-cluster saya harap ia akan membantu semua orang.
Pewawancara kadangkala akan bertanya kepada anda, beritahu saya cara mendayakan berbilang proses dalam nodejs Modul kluster harus segera muncul dalam fikiran anda. sekarang izinkan saya membawa anda meneroka penggunaan modul kluster.
Node.js berjalan dalam satu proses secara lalai Untuk sistem 32-bit, ia boleh menggunakan sehingga 512MB memori dan untuk 64-. sistem bit, ia boleh menggunakan sehingga 1GB memori. Untuk komputer dengan CPU berbilang teras, ini sangat tidak cekap kerana hanya satu teras yang sedang berjalan dan teras yang lain melahu. Modul kluster dicadangkan untuk menyelesaikan masalah ini.
Modul kluster membenarkan penubuhan proses utama dan beberapa proses pekerja, dengan proses utama memantau dan menyelaraskan perjalanan proses pekerja. Pekerja menggunakan komunikasi antara proses untuk bertukar-tukar mesej Modul kluster mempunyai pengimbang beban terbina dalam dan menggunakan algoritma Round-robin untuk menyelaraskan beban antara proses pekerja. Apabila berjalan, semua pautan yang baru ditubuhkan diselesaikan oleh proses utama, dan kemudian proses utama memperuntukkan sambungan TCP kepada proses pekerja yang ditetapkan.
var cluster = require('cluster'); var os = require('os'); if (cluster.isMaster){ for (var i = 0, n = os.cpus().length; i < n; i += 1){ cluster.fork(); } } else { http.createServer(function(req, res) { res.writeHead(200); res.end("hello world\n"); }).listen(8000); }
Kod di atas terlebih dahulu menentukan sama ada proses semasa adalah proses utama (cluster.isMaster Jika ya, buat beberapa proses pekerja baharu mengikut bilangan teras CPU, jika tidak, itu bermakna). proses semasa adalah proses pekerja, kemudian mulakan program pelayan dalam proses.
Satu kelemahan kod di atas ialah apabila proses kerja hang, proses utama tidak boleh tahu. Untuk menyelesaikan masalah ini, anda boleh menggunakan fungsi mendengar untuk acara dalam talian dan acara keluar dalam proses utama.
var cluster = require('cluster'); if(cluster.isMaster) { var numWorkers = require('os').cpus().length; console.log('Master cluster setting up ' + numWorkers + ' workers...'); for(var i = 0; i < numWorkers; i++) { cluster.fork(); } cluster.on('online', function(worker) { console.log('Worker ' + worker.process.pid + ' is online'); }); cluster.on('exit', function(worker, code, signal) { console.log('Worker ' + worker.process.pid + ' died with code: ' + code + ', and signal: ' + signal); console.log('Starting a new worker'); cluster.fork(); }); }
Dalam kod di atas, sebaik sahaja proses utama mendengar peristiwa keluar dari proses pekerja, ia akan memulakan semula proses pekerja. Setelah proses pekerja dimulakan dengan jayanya dan boleh berjalan seperti biasa, acara dalam talian akan dipancarkan.
objek pekerja
Objek pekerja ialah nilai pulangan cluster.fork() dan mewakili proses pekerja.
Sifat dan kaedahnya adalah seperti berikut.
(1) worker.id
worker.id mengembalikan nombor proses unik pekerja semasa. Nombor ini juga merupakan nilai indeks dalam kluster.pekerja yang menunjuk kepada proses semasa.
(2) worker.process
Semua proses pekerja dijana menggunakan child_process.fork(). Objek yang dikembalikan oleh child_process.fork() disimpan dalam worker.process. Melalui atribut ini, anda boleh mendapatkan objek proses di mana pekerja berada.
(3) worker.send()
Kaedah ini digunakan dalam proses utama untuk menghantar maklumat kepada proses kanak-kanak.
if (cluster.isMaster) { var worker = cluster.fork(); worker.send('hi there'); } else if (cluster.isWorker) { process.on('message', function(msg) { process.send(msg); }); }
Fungsi kod di atas ialah proses pekerja menggemakan setiap mesej yang dihantar oleh proses utama.
Dalam proses pekerja, untuk menghantar mesej ke proses utama, gunakan process.send(message); untuk mendengar mesej yang dihantar oleh proses utama, gunakan kod berikut. Mesej yang dihantar oleh
process.on('message', function(message) { console.log(message); });
boleh menjadi rentetan atau objek JSON. Di bawah ialah contoh menghantar objek JSON.
worker.send({ type: 'task 1', from: 'master', data: { // the data that you want to transfer } });
objek cluster.workers
Objek ini hanya tersedia untuk proses utama dan mengandungi semua proses pekerja. Nilai utama setiap ahli ialah objek proses pekerja dan nama kunci ialah atribut worker.id bagi proses pekerja.
function eachWorker(callback) { for (var id in cluster.workers) { callback(cluster.workers[id]); } } eachWorker(function(worker) { worker.send('big announcement to all workers'); });
Kod di atas digunakan untuk merentasi semua proses pekerja.
Peristiwa data soket semasa juga boleh menggunakan atribut id untuk mengenal pasti proses pekerja.
socket.on('data', function(id) { var worker = cluster.workers[id]; });
Atribut dan kaedah modul kelompok
isMaster, isWorker
isMaster atribut Mengembalikan nilai Boolean yang menunjukkan sama ada proses semasa adalah proses utama. Atribut ini ditentukan oleh process.env.NODE_UNIQUE_ID Jika process.env.NODE_UNIQUE_ID tidak ditentukan, ini bermakna proses itu adalah proses utama.
Atribut isWorker mengembalikan nilai Boolean yang menunjukkan sama ada proses semasa ialah proses kerja. Ia betul-betul bertentangan dengan nilai atribut isMaster.
fork()
Kaedah fork digunakan untuk mencipta proses pekerja baharu dan konteksnya disalin ke proses utama. Hanya proses utama yang boleh memanggil kaedah ini.
Kaedah ini mengembalikan objek pekerja.
kill()
Kaedah bunuh digunakan untuk menamatkan proses pekerja. Ia boleh menerima parameter yang mewakili isyarat sistem.
Jika pada masa ini merupakan proses utama, ia akan menamatkan hubungan dengan worker.process, dan kemudian menghantar kaedah isyarat sistem kepada proses pekerja. Jika pada masa ini merupakan proses pekerja, ia akan menamatkan komunikasi dengan proses utama, kemudian keluar, mengembalikan 0.
Dalam versi terdahulu, kaedah ini juga dipanggil worker.destroy() .
acara mendengar
Selepas proses pekerja memanggil kaedah mendengar, acara "mendengar" dihantar ke pelayan proses dan kemudian ke proses utama.
Fungsi panggil balik acara ini menerima dua parameter, satu ialah objek pekerja semasa dan satu lagi ialah objek alamat, termasuk URL, port, jenis alamat (IPv4, IPv6, soket Unix, UDP) dan lain-lain maklumat. Ini berguna untuk aplikasi Node yang menyediakan berbilang URL.
Mulakan semula perkhidmatan Nod tanpa gangguan
重启服务需要关闭后再启动,利用cluster模块,可以做到先启动一个worker进程,再把原有的所有work进程关闭。这样就能实现不中断地重启Node服务。
首先,主进程向worker进程发出重启信号。
workers[wid].send({type: 'shutdown', from: 'master'});
worker进程监听message事件,一旦发现内容是shutdown,就退出。
process.on('message', function(message) { if(message.type === 'shutdown') { process.exit(0); } });
下面是一个关闭所有worker进程的函数。
function restartWorkers() { var wid, workerIds = []; for(wid in cluster.workers) { workerIds.push(wid); } workerIds.forEach(function(wid) { cluster.workers[wid].send({ text: 'shutdown', from: 'master' }); setTimeout(function() { if(cluster.workers[wid]) { cluster.workers[wid].kill('SIGKILL'); } }, 5000); }); };
PM2模块
PM2模块是cluster模块的一个包装层。它的作用是尽量将cluster模块抽象掉,让用户像使用单进程一样,部署多进程Node应用。
// app.js var http = require('http'); http.createServer(function(req, res) { res.writeHead(200); res.end("hello world"); }).listen(8080);
用PM2从命令行启动这段代码
$ pm2 start app.js -i 4
上面代码的i参数告诉PM2,这段代码应该在cluster_mode启动,且新建worker进程的数量是4个。如果i参数的值是0,那么当前机器有几个CPU内核,PM2就会启动几个worker进程。
如果一个worker进程由于某种原因挂掉了,会立刻重启该worker进程。
# 重启所有worker进程 $ pm2 reload all
每个worker进程都有一个id,可以用下面的命令查看单个worker进程的详情。
$ pm2 show <worker id>
关闭worker进程的时候,可以部署下面的代码,让worker进程监听shutdown消息。一旦收到这个消息,进行完毕收尾清理工作再关闭
process.on('message', function(msg) { if (msg === 'shutdown') { close_all_connections(); delete_logs(); server.close(); process.exit(0); } });
更多node相关知识,请访问:nodejs 教程!!
Atas ialah kandungan terperinci Mari kita bincangkan tentang modul Nodejs-cluster dan perkenalkan cara menggunakannya.. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!