Teman-teman yang menggunakan nodeJs semua tahu bahwa node adalah satu utas, yang berarti bahwa ketika berjalan pada CPU 8-core, Anda hanya dapat menggunakan kekuatan komputasi satu inti.
Threading tunggal selalu menjadi kritik terhadap node, tetapi dengan diperkenalkannya cluster dalam versi 0.6, situasi ini telah berubah. Pengembang dapat mengandalkan cluster untuk dengan mudah memperluas server node mereka ke server multi-threaded.
Apa itu cluster
Cluster adalah perpustakaan multi-threaded yang disediakan oleh Node. Pengguna dapat menggunakannya untuk membuat beberapa utas. Thread berbagi port mendengarkan. Ketika ada permintaan eksternal ke port ini, cluster akan meneruskan permintaan ke utas acak. Karena setiap utas node akan menempati puluhan megabyte memori, tidak mungkin membuat utas untuk setiap permintaan seperti PHP. Secara umum, jumlah utas yang dibuat tidak akan melebihi jumlah inti CPU paling banyak.
Salinan kode adalah sebagai berikut:
var cluster = membutuhkan ('cluster');
var http = membutuhkan ('http');
var numcpus = membutuhkan ('os'). cpus (). panjang;
if (cluster.ismaster) {
// pekerja garpu.
untuk (var i = 0; i <numcpus; i ++) {
cluster.fork ();
}
cluster.on ('keluar', fungsi (pekerja, kode, sinyal) {
console.log ('pekerja' + worker.process.pid + 'die');
});
} kalau tidak {
// Pekerja dapat berbagi koneksi TCP
// Dalam hal ini server http
http.createServer (function (req, res) {
res.writeHead (200);
res.end ("halo dunia/n");
}). Dengarkan (8000);
}
Seperti yang ditunjukkan dalam kode di atas, cluster.ismaster akan diatur ke true ketika program berjalan. Setelah memanggil cluster.fork (), program akan membuat utas dan menjalankannya kembali. Pada saat ini, cluster.ismaster akan diatur ke false. Kami terutama menggunakan variabel ini untuk menentukan apakah utas saat ini milik utas anak.
Dapat juga dicatat bahwa setelah setiap utas anak dibuat, ia akan mendengarkan Port 8000 tanpa menyebabkan konflik. Ini adalah fungsi port bersama cluster.
Komunikasi antara utas
Saat utas dibuat, mereka tidak berbagi memori atau data satu sama lain. Semua pertukaran data hanya dapat diproses di utas utama melalui pekerja. Berikut ini mencantumkan contoh sistem siaran.
Salinan kode adalah sebagai berikut:
var cluster = membutuhkan ('cluster');
var http = membutuhkan ('http');
var numcpus = membutuhkan ('os'). cpus (). panjang;
if (cluster.ismaster) {
var pekerja = [];
// Buat pekerja baru
function newerworker () {
var worker = cluster.fork ();
// dengarkan informasi. Jika jenisnya disiarkan, itu akan ditentukan sebagai siaran
worker.on ('pesan', fungsi (msg) {
if (msg.type == 'siaran') {
var event = msg.event;
// Kirim siaran ini ke semua pekerja
workers.foreach (function (pekerja) {
worker.send (acara);
})
}
});
pekerja kembali;
}
untuk (var i = 0; i <numcpus; i ++) {
workers.push (newerworker ());
}
cluster.on ('online', function (pekerja) {
Console.log ('Worker %d adalah online', Worker.id);
})
} kalau tidak {
var worker = cluster.worker;
// siaran akan mengirim pesan dengan tipe siaran, acara adalah konten siaran
worker.broadcast = function (event) {
worker.send ({
Ketik: 'siaran',
Acara: Acara
});
}
// Ini tidak mungkin untuk mendengarkan informasi yang dikembalikan menggunakan pekerja di sini.
Process.on ('Message', function (event) {
console.log ('pekerja:'+worker.id+'event yang dipulihkan dari'+event.workerid);
})
// Kirim siaran
worker.broadcast ({
Pesan: 'Online',
WorkerID: Worker.id
})
}
Masalah yang harus diperhatikan
Juga disebutkan di atas bahwa data tidak dapat dibagikan antar utas, dan semua pertukaran data hanya dapat dipertukarkan melalui komunikasi antara utas. Selain itu, data yang dipertukarkan dapat serial, jadi fungsi, deskriptor file, dan httpresponse tidak dapat dilewati.
Jika Anda menggunakan cluster, Anda perlu mempertimbangkan masalah pertukaran data saat merancang program. Pendekatan saya sendiri adalah menyimpan semua data yang mirip dengan sesi di Redis, dan setiap utas melakukan pekerjaan penyimpanan dan penarikan, dan semua data tidak ditempatkan dalam memori simpul.
Poin terakhir, cluster saat ini secara resmi ditandai sebagai eksperimental oleh node, dan API dapat berubah di masa depan.