Rumah >hujung hadapan web >tutorial js >Memahami Kluster Node.js: Konsep Teras
Jika anda telah menggunakan PM2 untuk mengurus proses Node.js, anda mungkin perasan ia menyokong mod kluster. Mod ini membolehkan Node.js mencipta berbilang proses. Apabila anda menetapkan bilangan kejadian dalam mod kelompok kepada maks, PM2 secara automatik akan mencipta beberapa proses Nod yang sepadan dengan teras CPU yang tersedia pada pelayan.
PM2 mencapai ini dengan memanfaatkan modul Kluster Node.js. Modul ini menangani sifat benang tunggal Node.js, yang secara tradisinya mengehadkan keupayaannya untuk menggunakan berbilang teras CPU. Tetapi bagaimanakah modul Kluster berfungsi secara dalaman? Bagaimanakah proses berkomunikasi antara satu sama lain? Bagaimanakah pelbagai proses boleh mendengar pada port yang sama? Dan bagaimanakah Node.js mengedarkan permintaan kepada proses ini? Jika anda ingin tahu tentang soalan ini, baca terus.
Proses pekerja Node.js dibuat menggunakan kaedah child_process.fork(). Ini bermakna terdapat satu proses induk dan beberapa proses anak. Kod biasanya kelihatan seperti ini:
const cluster = require('cluster'); const os = require('os'); if (cluster.isMaster) { for (let i = 0, n = os.cpus().length; i < n; i++) { cluster.fork(); } } else { // Start the application }
Jika anda telah mempelajari sistem pengendalian, anda mungkin biasa dengan panggilan sistem fork(). Proses panggilan adalah ibu bapa, manakala proses yang baru dibuat adalah kanak-kanak. Proses anak ini berkongsi segmen dan tindanan data yang sama seperti induk, tetapi ruang memori fizikal mereka tidak semestinya dikongsi. Dalam Kluster Node.js, proses master mendengar pada port dan mengedarkan permintaan masuk ke proses pekerja. Ini melibatkan menangani tiga topik teras: komunikasi antara proses (IPC), strategi pengimbangan beban dan perdengaran port berbilang proses.
Proses master mencipta proses anak menggunakan process.fork(). Komunikasi antara proses ini dikendalikan melalui saluran IPC. Sistem pengendalian menyediakan beberapa mekanisme untuk komunikasi antara proses, seperti:
Mesej Lulus
Memproses pertukaran data dengan menghantar dan menerima mesej.
Semaphore
Semaphore ialah nilai status yang diberikan sistem. Proses yang tiada kawalan akan terpaksa dihentikan di pusat pemeriksaan tertentu, menunggu isyarat untuk diteruskan. Apabila terhad kepada nilai binari (0 atau 1), mekanisme ini dikenali sebagai "mutex" (kunci pengecualian bersama).
Paip
Paip menghubungkan dua proses, membolehkan output satu proses berfungsi sebagai input untuk yang lain. Ini boleh dibuat menggunakan panggilan sistem paip. | arahan dalam skrip shell ialah contoh biasa mekanisme ini.
Node.js menggunakan mekanisme berasaskan peristiwa untuk komunikasi antara proses ibu bapa dan anak. Berikut ialah contoh proses induk yang menghantar pemegang pelayan TCP kepada proses anak:
const cluster = require('cluster'); const os = require('os'); if (cluster.isMaster) { for (let i = 0, n = os.cpus().length; i < n; i++) { cluster.fork(); } } else { // Start the application }
Seperti yang dinyatakan sebelum ini, semua permintaan diedarkan oleh proses master. Memastikan beban pelayan diagihkan sama rata antara proses pekerja memerlukan strategi pengimbangan beban. Node.js menggunakan algoritma round-robin secara lalai.
Kaedah round-robin ialah algoritma pengimbangan beban biasa yang turut digunakan oleh Nginx. Ia berfungsi dengan mengedarkan permintaan masuk ke setiap proses secara berurutan, bermula dari proses pertama dan menggelung kembali selepas mencapai yang terakhir. Walau bagaimanapun, kaedah ini menganggap kapasiti pemprosesan yang sama merentas semua proses. Dalam senario di mana masa pengendalian permintaan berbeza dengan ketara, ketidakseimbangan beban mungkin berlaku.
Untuk menangani perkara ini, Nginx sering menggunakan Weighted Round-Robin (WRR), di mana pelayan diberikan pemberat yang berbeza. Pelayan dengan berat tertinggi dipilih sehingga beratnya dikurangkan kepada sifar, di mana kitaran bermula semula berdasarkan jujukan berat baharu.
Anda boleh melaraskan strategi pengimbangan beban dalam Node.js dengan menetapkan pembolehubah persekitaran NODE_CLUSTER_SCHED_POLICY atau mengkonfigurasinya melalui cluster.setupMaster(options). Menggabungkan Nginx untuk kluster berbilang mesin dengan Kluster Node.js untuk pengimbangan berbilang proses mesin tunggal ialah pendekatan biasa.
Dalam versi awal Node.js, berbilang proses mendengar pada port yang sama bersaing untuk sambungan masuk, yang membawa kepada pengagihan beban yang tidak sekata. Ini kemudiannya diselesaikan dengan strategi round-robin. Pendekatan semasa berfungsi seperti berikut:
Pada dasarnya, proses induk mendengar pada port dan mengedarkan sambungan kepada proses pekerja menggunakan strategi yang ditentukan (cth., round-robin). Reka bentuk ini menghapuskan persaingan antara pekerja tetapi memerlukan proses induk yang sangat stabil.
Menggunakan Mod Kluster PM2 sebagai titik masuk, artikel ini meneroka prinsip teras di sebalik modul Kluster Node.js untuk melaksanakan aplikasi berbilang proses. Kami menumpukan pada tiga aspek utama: komunikasi antara proses, pengimbangan beban dan pendengaran port berbilang proses.
Dengan mempelajari modul Kluster, kita dapat melihat bahawa banyak prinsip asas dan algoritma adalah universal. Sebagai contoh, algoritma round-robin digunakan dalam kedua-dua penjadualan proses sistem pengendalian dan pengimbangan beban pelayan. Seni bina master-worker menyerupai reka bentuk pelbagai proses dalam Nginx. Begitu juga, mekanisme seperti semaphore dan paip terdapat di mana-mana dalam pelbagai paradigma pengaturcaraan.
Walaupun teknologi baharu terus muncul, asasnya kekal konsisten. Memahami konsep teras ini membolehkan kami mengekstrapolasi dan menyesuaikan diri dengan cabaran baharu dengan yakin.
Leapcell ialah Platform Tanpa Pelayan Generasi Seterusnya untuk Pengehosan Web, Tugas Async dan Redis:
Sokongan Berbilang Bahasa
Kerahkan projek tanpa had secara percuma
Kecekapan Kos yang tiada tandingan
Pengalaman Pembangun Diperkemas
Skala Mudah dan Prestasi Tinggi
Terokai lagi dalam Dokumentasi!
Ikuti kami di X: @LeapcellHQ
Baca di blog kami
Atas ialah kandungan terperinci Memahami Kluster Node.js: Konsep Teras. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!