Node.js cluster va PM2 bilan ishga tushirish
worker_threads darsida bitta og’ir hisobni alohida oqimga chiqardingiz. Endi boshqa savol: dastur ishlayotgan kompyuterda 12 ta yadro bor, Node.js esa bittasini ishlatyapti. Qolgan o’n bittasi bo’sh turibdi.
Yana bir muammo: dastur xato bilan yiqilsa, uni kim qayta ishga tushiradi? Ikkala savolga ham javob bor.
Nechta yadro bor
Avval raqamni ko’ramiz:
const os = require("node:os");
console.log("Yadrolar soni:", os.cpus().length);
console.log("Model:", os.cpus()[0].model);
node cpu-info.js
Yadrolar soni: 12
Model: 13th Gen Intel(R) Core(TM) i5-13420H
Sizda boshqa son chiqadi — bu kompyuterga bog’liq.
cluster nima
Bu worker_threads dagi worker bilan bir xil emas. Farqi jiddiy:
worker_threads |
cluster |
|
|---|---|---|
| Nima ochiladi | Oqim | To’liq jarayon |
| Xotira | Jarayon ichida | Har nusxada alohida |
| Asosiy vazifa | Og’ir hisobni ko’chirish | Yukni yadrolarga taqsimlash |
Birinchi cluster
cluster-demo.js:
const cluster = require("node:cluster");
const os = require("node:os");
if (cluster.isPrimary) {
const cpuCount = os.cpus().length;
console.log(`Asosiy jarayon: ${process.pid}`);
console.log(`Yadrolar soni: ${cpuCount}`);
// Namuna uchun faqat ikkita ishchi ochamiz
for (let i = 0; i < 2; i++) {
cluster.fork();
}
cluster.on("exit", (worker) => {
console.log(`Ishchi ${worker.process.pid} to'xtadi`);
});
} else {
console.log(`Ishchi ishga tushdi: ${process.pid}`);
process.exit(0);
}
node cluster-demo.js
Asosiy jarayon: 11764
Yadrolar soni: 12
Ishchi ishga tushdi: 23024
Ishchi ishga tushdi: 22544
Ishchi 23024 to'xtadi
Ishchi 22544 to'xtadi
Bitta fayl uch marta ishladi: bir marta asosiy jarayon sifatida, ikki marta ishchi sifatida.
Kalit qism — cluster.isPrimary sharti. cluster.fork() xuddi shu
faylni qaytadan ishga tushiradi, lekin unda isPrimary qiymati false
bo’ladi va else tarmog’i bajariladi.
Ishchini avtomatik tiklash
Cluster ning ikkinchi foydasi — yiqilgan ishchini qayta ochish.
restart-demo.js:
const cluster = require("node:cluster");
if (cluster.isPrimary) {
let restartCount = 0;
cluster.fork();
cluster.on("exit", (worker, code) => {
console.log(`Ishchi ${worker.process.pid} yiqildi, kod: ${code}`);
// Namuna cheksiz aylanmasligi uchun ikki marta tiklaymiz
if (restartCount < 2) {
restartCount += 1;
console.log("Yangi ishchi ochilyapti...");
cluster.fork();
} else {
console.log("Tiklash to'xtatildi");
}
});
} else {
console.log(`Ishchi ochildi: ${process.pid}`);
// Ataylab xato bilan tugatamiz
process.exit(1);
}
node restart-demo.js
Ishchi ochildi: 15208
Ishchi 15208 yiqildi, kod: 1
Yangi ishchi ochilyapti...
Ishchi 9640 ochildi
Ishchi 9640 yiqildi, kod: 1
Yangi ishchi ochilyapti...
Ishchi 19312 ochildi
Ishchi 19312 yiqildi, kod: 1
Tiklash to'xtatildi
Asosiy jarayon har yiqilishni sezdi va yangisini ochdi. Haqiqiy loyihada shu mantiq dasturni tunu kun ishlatib turadi.
Bu ishni qo’lda qilish shart emas
Yuqoridagi kod ishlaydi, lekin savollar qoladi. Dastur kompyuter o’chib yonganda o’zi ishga tushadimi? Jurnal qayerga yoziladi? Necha marta yiqilgani qanday bilinadi?
Bularning hammasi tayyor vositada hal qilingan.
PM2 ni o’rnatish
PM2 barcha loyihalar uchun bitta marta, global o’rnatiladi:
npm install -g pm2
added 138 packages in 12s
Tekshirish:
pm2 --version
5.4.2
Sizda boshqa versiya chiqishi mumkin.
Dasturni PM2 bilan ishga tushirish
Sinash uchun oddiy dastur kerak. server-demo.js:
let count = 0;
setInterval(() => {
count += 1;
console.log(`Ishlayapti, hisob: ${count}, pid: ${process.pid}`);
}, 2000);
Ishga tushiramiz:
pm2 start server-demo.js
┌────┬────────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┐
│ id │ name │ mode │ ↺ │ status │ cpu │ mem │ user │
├────┼────────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┤
│ 0 │ server-demo │ fork │ 0 │ online │ 0% │ 45mb │ bakhtiyor │
└────┴────────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┘
Terminal bo’shadi, dastur esa fonda ishlayapti. Buni tekshirish uchun:
pm2 list
Holat online bo’lsa — hammasi joyida.
Jurnalni ko’rish
Dastur fonda ishlagani uchun console.log chiqishi ekranda ko’rinmaydi.
PM2 uni faylga yozadi:
pm2 logs server-demo --lines 3
0|server-demo | Ishlayapti, hisob: 1, pid: 20164
0|server-demo | Ishlayapti, hisob: 2, pid: 20164
0|server-demo | Ishlayapti, hisob: 3, pid: 20164
Kuzatishni to’xtatish uchun Ctrl + C bosiladi — dastur o’zi ishlashda
davom etadi.
Ko’p yadroda ishga tushirish
Endi eng foydali bayroq. -i PM2 ga nechta nusxa ochishni aytadi:
pm2 delete server-demo
pm2 start server-demo.js -i 4
┌────┬────────────────┬─────────┬─────────┬──────────┬────────┬──────┐
│ id │ name │ mode │ ↺ │ status │ cpu │ mem │
├────┼────────────────┼─────────┼─────────┼──────────┼────────┼──────┤
│ 0 │ server-demo │ cluster │ 0 │ online │ 0% │ 46mb │
│ 1 │ server-demo │ cluster │ 0 │ online │ 0% │ 46mb │
│ 2 │ server-demo │ cluster │ 0 │ online │ 0% │ 46mb │
│ 3 │ server-demo │ cluster │ 0 │ online │ 0% │ 46mb │
└────┴────────────────┴─────────┴─────────┴──────────┴────────┴──────┘
mode ustunida cluster yozuvi paydo bo’ldi. PM2 yuqorida qo’lda
yozgan cluster mantiqini o’zi bajaryapti.
Yadrolar soniga qarab o’zi tanlashi uchun max yoziladi:
pm2 delete server-demo
pm2 start server-demo.js -i max
Asosiy buyruqlar
| Buyruq | Vazifasi |
|---|---|
pm2 start app.js |
Ishga tushiradi |
pm2 start app.js -i max |
Har yadroga bitta nusxa ochadi |
pm2 list |
Ishlayotgan dasturlar ro’yxati |
pm2 logs <nom> |
Jurnalni ko’rsatadi |
pm2 restart <nom> |
Qayta ishga tushiradi |
pm2 stop <nom> |
To’xtatadi, ro’yxatda qoldiradi |
pm2 delete <nom> |
Ro’yxatdan olib tashlaydi |
pm2 monit |
Jonli kuzatuv oynasi |
Yiqilishni sinab ko’rish
PM2 haqiqatan tiklaydimi? crash-demo.js:
console.log("Ishga tushdi, pid:", process.pid);
setTimeout(() => {
throw new Error("Ataylab chiqarilgan xato");
}, 3000);
pm2 start crash-demo.js
pm2 list
Bir necha soniyadan keyin pm2 list ni qayta yuriting va ↺ ustuniga
qarang:
┌────┬────────────────┬─────────┬─────────┬──────────┬────────┬──────┐
│ id │ name │ mode │ ↺ │ status │ cpu │ mem │
├────┼────────────────┼─────────┼─────────┼──────────┼────────┼──────┤
│ 0 │ crash-demo │ fork │ 3 │ online │ 0% │ 44mb │
└────┴────────────────┴─────────┴─────────┴──────────┴────────┴──────┘
↺ ustuni — qayta ishga tushirishlar soni. Dastur uch marta yiqildi va
uch marta tiklandi.
Sinovni tugatgach tozalang:
pm2 delete crash-demo
Kompyuter yonganda o’zi ishga tushsin
Serverda eng kerakli sozlama:
pm2 startup
Buyruq tizimga mos xizmat faylini yaratish uchun bajarish kerak bo’lgan buyruqni ekranga chiqaradi. Uni nusxalab yuritasiz. Keyin joriy ro’yxatni saqlaysiz:
pm2 save
[PM2] Saving current process list...
[PM2] Successfully saved in /home/bakhtiyor/.pm2/dump.pm2
Shundan keyin server qayta yonganda PM2 saqlangan ro’yxatni o’zi tiklaydi.
Amaliy mashq
os.cpus().lengthbilan kompyuteringizdagi yadrolar sonini aniqlang;cluster-demo.jsni yozib ishga tushiring va uchta turlipidchiqqanini kuzating;restart-demo.jsbilan yiqilgan ishchi qayta ochilishini ko’ring;- PM2 ni o’rnatib,
server-demo.jsni fonda ishga tushiring vapm2 logsbilan jurnalni oching; - Xuddi shu dasturni
-i maxbilan qayta ishga tushirib,pm2 listda nechta nusxa paydo bo’lganini sanang; crash-demo.jsni ishga tushirib,↺ustuni o’sib borishini kuzating va so’ngpm2 deletebilan tozalang.
6-qadam eng muhimi: avtomatik tiklash qanday ishlashini va uning chegarasini bir vaqtda ko’rsatadi.
Qisqacha xulosa
- Node.js bitta jarayonda bitta yadroni ishlatadi — qolgani bo’sh qoladi.
clusterbir xil dasturning bir nechta jarayonini ochadi.cluster.fork()faqatcluster.isPrimarysharti ichida chaqiriladi.exithodisasida yangi ishchi ochib, yiqilgan dasturni tiklash mumkin.- PM2 shu ishni tayyor holda bajaradi va qo’shimcha jurnal hamda kuzatuv beradi.
pm2 start app.js -i maxdasturni har yadroga bitta nusxa qilib tarqatadi.pm2 startupvapm2 saveserver qayta yonganda avtomatik ishga tushishni ta’minlaydi.
Keyingi darsda SQLite bilan ishlash — ma’lumotni faylga emas, bazaga saqlash.