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

  1. os.cpus().length bilan kompyuteringizdagi yadrolar sonini aniqlang;
  2. cluster-demo.js ni yozib ishga tushiring va uchta turli pid chiqqanini kuzating;
  3. restart-demo.js bilan yiqilgan ishchi qayta ochilishini ko’ring;
  4. PM2 ni o’rnatib, server-demo.js ni fonda ishga tushiring va pm2 logs bilan jurnalni oching;
  5. Xuddi shu dasturni -i max bilan qayta ishga tushirib, pm2 list da nechta nusxa paydo bo’lganini sanang;
  6. crash-demo.js ni ishga tushirib, ustuni o’sib borishini kuzating va so’ng pm2 delete bilan 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.
  • cluster bir xil dasturning bir nechta jarayonini ochadi.
  • cluster.fork() faqat cluster.isPrimary sharti ichida chaqiriladi.
  • exit hodisasida 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 max dasturni har yadroga bitta nusxa qilib tarqatadi.
  • pm2 startup va pm2 save server qayta yonganda avtomatik ishga tushishni ta’minlaydi.

Keyingi darsda SQLite bilan ishlash — ma’lumotni faylga emas, bazaga saqlash.

Bu dars foydali bo'ldimi?

marta ko'rildi