Rumah >hujung hadapan web >tutorial js >Cara Meningkatkan Prestasi Node.js

Cara Meningkatkan Prestasi Node.js

Barbara Streisand
Barbara Streisandasal
2024-12-29 02:50:09621semak imbas

How to Enhance Node.js PerformanceNode.js ialah persekitaran masa jalan yang berkuasa yang telah merevolusikan pembangunan bahagian pelayan. Walaupun ia sememangnya berprestasi, untuk mencapai prestasi optimum selalunya memerlukan pengoptimuman yang teliti. Dalam artikel ini, kami akan meneroka kaedah untuk meningkatkan prestasi Node.js, bermula dengan pengelompokan dan meliputi strategi penting yang lain.

1. Pengelompokan

Fahami Pengelompokan

Penghimpunan dalam Node.js membolehkan anda menggunakan berbilang teras CPU untuk mengendalikan permintaan serentak, mengatasi sifat berbenang tunggal Node.js. Ini dicapai dengan melahirkan berbilang proses yang berkongsi port pelayan yang sama.

Faedah Pengelompokan

  • Peningkatan Daya Tahan: Mengendalikan lebih banyak permintaan secara serentak.
  • Skalabiliti: Penggunaan teras CPU yang lebih baik.
  • Toleransi Kesalahan: Jika satu proses ranap, yang lain boleh meneruskan permintaan.

Contoh Tanpa Pengelompokan

const http = require('http');
const PORT = 3000;
http.createServer((req, res) => {
    res.writeHead(200);
    res.end('Hello, world!');
}).listen(PORT, () => {
    console.log(`Server running on port ${PORT}`);
});

Contoh Dengan Pengelompokan

const cluster = require('cluster');
const http = require('http');
const numCPUs = require('os').cpus().length;

if (cluster.isMaster) {
    console.log(`Master process ${process.pid} is running`);
    // Fork workers
    for (let i = 0; i < numCPUs; i++) {
        cluster.fork();
    }
    cluster.on('exit', (worker, code, signal) => {
        console.log(`Worker ${worker.process.pid} died`);
        cluster.fork(); // Restart a worker if one dies
    });
} else {
    http.createServer((req, res) => {
        res.writeHead(200);
        res.end('Hello, world!');
    }).listen(3000, () => {
        console.log(`Worker ${process.pid} started`);
    });
}

Perbandingan Prestasi

  • Tanpa pengelompokan, satu teras CPU digunakan, membawa kepada kebolehskalaan terhad.
  • Dengan pengelompokan, semua teras CPU mengendalikan permintaan, meningkatkan daya pemprosesan dan kecekapan dengan ketara.

2. Pengaturcaraan Asynchronous

Fahami Pengaturcaraan Asynchronous

Node.js bergantung pada I/O tidak menyekat untuk mengendalikan berbilang permintaan dengan cekap. Menulis kod tak segerak memastikan gelung acara kekal dinyahsekat.

Faedah Pengaturcaraan Asynchronous

  • Tingkat Responsif: Mengendalikan lebih banyak permintaan serentak.
  • Penggunaan Sumber yang Lebih Baik: Mengelakkan menunggu terbiar untuk operasi I/O.

Contoh Tanpa Pengaturcaraan Async

const fs = require('fs');
const data = fs.readFileSync('file.txt', 'utf8');
console.log(data);

Contoh Dengan Pengaturcaraan Async

const fs = require('fs');
fs.readFile('file.txt', 'utf8', (err, data) => {
    if (err) throw err;
    console.log(data);
});

Perbandingan Prestasi

  • Operasi segerak menyekat gelung acara, menghalang tugasan lain daripada diproses.
  • Operasi tak segerak membolehkan berbilang tugasan dilaksanakan serentak, meningkatkan prestasi keseluruhan.

3. Pengimbangan Beban

Fahami Pengimbangan Beban

Pengimbangan beban mengedarkan permintaan masuk merentas berbilang pelayan atau proses, menghalang mana-mana pelayan tunggal daripada menjadi hambatan.

Faedah Pengimbangan Beban

  • Skala yang Dipertingkat: Mengendalikan volum trafik yang lebih besar.
  • Lewahan: Memastikan masa beroperasi walaupun satu pelayan gagal.

Contoh Menggunakan Nginx

Konfigurasi Nginx yang mudah untuk pengimbangan beban:

const http = require('http');
const PORT = 3000;
http.createServer((req, res) => {
    res.writeHead(200);
    res.end('Hello, world!');
}).listen(PORT, () => {
    console.log(`Server running on port ${PORT}`);
});

Perbandingan Prestasi

  • Tanpa pengimbangan beban, satu pelayan boleh menjadi terharu.

4. Caching

Fahami Caching

Caching menyimpan data yang kerap diakses dalam ingatan, mengurangkan keperluan untuk pengiraan mahal atau pertanyaan pangkalan data.

Faedah Caching

  • Kependaman Dikurangkan: Akses lebih pantas kepada data yang kerap digunakan.
  • Penggunaan Sumber Rendah: Kurang pertanyaan pangkalan data.

Contoh Menggunakan Redis

const cluster = require('cluster');
const http = require('http');
const numCPUs = require('os').cpus().length;

if (cluster.isMaster) {
    console.log(`Master process ${process.pid} is running`);
    // Fork workers
    for (let i = 0; i < numCPUs; i++) {
        cluster.fork();
    }
    cluster.on('exit', (worker, code, signal) => {
        console.log(`Worker ${worker.process.pid} died`);
        cluster.fork(); // Restart a worker if one dies
    });
} else {
    http.createServer((req, res) => {
        res.writeHead(200);
        res.end('Hello, world!');
    }).listen(3000, () => {
        console.log(`Worker ${process.pid} started`);
    });
}

Perbandingan Prestasi

  • Tanpa caching, pertanyaan pangkalan data berulang atau pengiraan memperlahankan respons.
  • Caching secara drastik mengurangkan masa respons dan beban pelayan.

5. Pemantauan Gelung Acara

Fahami Pemantauan Gelung Acara

Memantau gelung acara membantu mengesan kesesakan prestasi yang disebabkan oleh operasi menyekat.

Faedah Pemantauan Gelung Acara

  • Mengenal pasti Isu: Mengesan kod sekatan.
  • Meningkatkan Prestasi: Membimbing pengoptimuman.

Contoh Menggunakan Alat

const fs = require('fs');
const data = fs.readFileSync('file.txt', 'utf8');
console.log(data);

Perbandingan Prestasi

Memantau gelung acara membolehkan pengesanan proaktif dan penyelesaian kesesakan, mengekalkan prestasi lancar.


6. Menggunakan Strim untuk Data Besar

Fahami Aliran

Strim memproses ketulan data yang besar secara berperingkat, mengurangkan penggunaan memori.

Faedah Aliran

  • Penggunaan Memori Rendah: Memproses data sekeping demi sekeping.
  • Pemprosesan Lebih Cepat: Mula memproses sebelum keseluruhan set data dimuatkan.

Contoh Tanpa Aliran

const fs = require('fs');
fs.readFile('file.txt', 'utf8', (err, data) => {
    if (err) throw err;
    console.log(data);
});

Contoh Dengan Aliran

http {
        upstream backend {
                server 127.0.0.1:3001;
                server 127.0.0.1:3002;
        }
        server {
                listen 80;
                location / {
                        proxy_pass http://backend;
                }
        }
}

Perbandingan Prestasi

  • Tanpa strim, fail besar boleh menggunakan memori yang berlebihan.
  • Strim membenarkan pemprosesan yang cekap dan bertingkat.

7. Pengoptimuman Pertanyaan Pangkalan Data

Fahami Pengoptimuman Pertanyaan Pangkalan Data

Pertanyaan pangkalan data yang cekap mengurangkan masa tindak balas dan beban pelayan.

Faedah Pengoptimuman Pertanyaan

  • Pertanyaan Lebih Pantas: Mengurangkan masa respons.
  • Kurangkan Penggunaan Sumber: Meminimumkan ketegangan pelayan.

Contoh Tanpa Pengoptimuman

const redis = require('redis');
const client = redis.createClient();
client.get('key', (err, data) => {
    if (data) {
        console.log('Cache hit:', data);
    } else {
        console.log('Cache miss');
        client.set('key', 'value');
    }
});

Contoh Dengan Pengoptimuman

const { monitorEventLoopDelay } = require('perf_hooks');
const h = monitorEventLoopDelay();
h.enable();
setInterval(() => {
    console.log(`Event loop delay: ${h.mean} ms`);
}, 1000);

Perbandingan Prestasi

Pertanyaan yang dioptimumkan hanya mendapatkan data yang diperlukan, mengurangkan masa pemprosesan dan meningkatkan prestasi.


Kesimpulan

Mengoptimumkan prestasi Node.js memerlukan gabungan strategi, daripada memanfaatkan pengelompokan kepada memantau gelung acara. Dengan melaksanakan teknik ini, anda boleh membina aplikasi yang berprestasi tinggi dan berskala.

Atas ialah kandungan terperinci Cara Meningkatkan Prestasi Node.js. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn