Rumah  >  Artikel  >  hujung hadapan web  >  10 petua pengoptimuman prestasi untuk nodejs_node.js

10 petua pengoptimuman prestasi untuk nodejs_node.js

WBOY
WBOYasal
2016-05-16 16:41:501409semak imbas

Berikut ialah 10 peraturan prestasi yang kami ikuti semasa menggunakan Node.js:

1. Elakkan menggunakan kod segerak

Dengan reka bentuk, Node.js adalah satu benang. Untuk mendayakan satu utas mengendalikan banyak permintaan serentak, anda tidak boleh membiarkan utas menunggu untuk menyekat, segerak atau operasi yang berjalan lama. Ciri tersendiri Node.js ialah ia direka dan dilaksanakan dari atas ke bawah untuk mencapai pelaksanaan tak segerak. Ini menjadikannya sesuai untuk program berasaskan acara.

Malangnya, panggilan segerak/sekat masih boleh berlaku. Contohnya, banyak operasi sistem fail mempunyai versi segerak dan tak segerak, seperti writeFile dan writeFileSync. Walaupun anda menggunakan kod untuk mengawal kaedah penyegerakan, anda masih boleh menggunakan pustaka fungsi luaran yang menyekat panggilan secara tidak sengaja. Apabila anda melakukan ini, kesan ke atas prestasi adalah besar.

// Good: write files asynchronously
fs.writeFile('message.txt', 'Hello Node', function (err) {
 console.log("It's saved and the server remains responsive!");
});
 
// BAD: write files synchronously
fs.writeFileSync('message.txt', 'Hello Node');
console.log("It's saved, but you just blocked ALL requests!");

Pelaksanaan log permulaan kami secara tidak sengaja menyertakan panggilan segerak untuk menulis kandungan ke cakera. Jika kita tidak melakukan ujian prestasi, masalah ini akan mudah diabaikan. Apabila diuji terhadap contoh node.js dalam kotak pembangun, panggilan segerak ini akan menyebabkan prestasi menurun daripada beribu-ribu permintaan sesaat kepada beberapa dozen sahaja.

2. Tutup kolam soket

Klien http Node.js secara automatik menggunakan pengumpulan soket: secara lalai, ia mengehadkan setiap hos kepada 5 soket. Walaupun penggunaan semula soket boleh mengekalkan peningkatan sumber di bawah kawalan, ia boleh membawa kepada satu siri kesesakan jika anda perlu mengendalikan banyak permintaan serentak untuk data yang datang daripada hos yang sama. Dalam kes ini, adalah idea yang baik untuk meningkatkan nilai maxSockets atau mematikan kolam soket:

// Disable socket pooling
 
var http = require('http');
var options = {.....};
options.agent = false;
var req = http.request(options)

3 Jangan biarkan sumber statik menggunakan Node.js

Untuk sumber statik seperti css dan imej, gunakan WebServer standard dan bukannya Node.js. Sebagai contoh, LinkedIn Mobile menggunakan nginx. Kami juga menggunakan Rangkaian Penghantaran Kandungan (CDN), yang boleh menyalin aset statik ke pelayan di seluruh dunia. Ini mempunyai dua faedah: (1) Ia boleh mengurangkan beban pada pelayan node.js kami (2) CDN boleh mengurangkan masa menunggu dengan membenarkan kandungan statik dihantar pada pelayan yang lebih dekat dengan pengguna.

4. Render pada pelanggan

Mari kita bandingkan dengan cepat perbezaan antara rendering pelayan dan rendering klien. Jika kami menggunakan node.js untuk membuat pada bahagian pelayan, untuk setiap permintaan kami akan menghantar semula halaman HTML seperti berikut:

<!-- An example of a simple webpage rendered entirely server side -->
 
<!DOCTYPE html>
<html>
 <head>
  <title>LinkedIn Mobile</title>
 </head>
 <body>
  <div class="header">
   <img src="http://mobile-cdn.linkedin.com/images/linkedin.png" alt="LinkedIn"/>
  </div>
  <div class="body">
   Hello John!
  </div>
 </body>
</html>

Sila ambil perhatian bahawa semua kandungan pada halaman ini, kecuali nama pengguna, adalah kandungan statik: kandungan adalah sama untuk setiap pengguna dan muat semula halaman. Oleh itu, adalah lebih cekap untuk membenarkan Node.js hanya mengembalikan kandungan dinamik yang diperlukan oleh halaman dalam bentuk JSON.

{"name": "John"}
Selebihnya halaman—semua penanda HTML statik—boleh diletakkan dalam templat JavaScript (seperti templat underscore.js):

<!-- An example of a JavaScript template that can be rendered client side -->
 
<!DOCTYPE html>
<html>
 <head>
  <title>LinkedIn Mobile</title>
 </head>
 <body>
  <div class="header">
   <img src="http://mobile-cdn.linkedin.com/images/linkedin.png" alt="LinkedIn"/>
  </div>
  <div class="body">
   Hello <%= name %>!
  </div>
 </body>
</html>

Peningkatan prestasi datang dari tempat-tempat ini: Seperti yang dinyatakan dalam perkara ketiga, templat JavaScript statik boleh disediakan pada bahagian pelayan melalui pelayan web (seperti nginx), atau dilaksanakan menggunakan CDN yang lebih baik. Selain itu, templat JavaScript boleh dicache dalam penyemak imbas atau disimpan secara setempat Selepas semua halaman awal dimuatkan, satu-satunya data yang perlu dihantar kepada klien ialah JSON, yang akan menjadi yang paling berkesan. Kaedah ini boleh mengurangkan beban CPU, IO dan Node.js dengan banyak.

5. Gunakan gzip

Banyak pelayan dan pelanggan menyokong gzip untuk memampatkan permintaan dan respons. Sama ada menjawab pelanggan atau menghantar permintaan ke pelayan jauh, pastikan anda menggunakannya sepenuhnya.

6. Keselarian

Cuba selarikan semua operasi menyekat anda - permintaan kepada perkhidmatan jauh, panggilan DB, akses sistem fail. Ini akan mengurangkan masa menunggu operasi menyekat yang paling perlahan, dan bukannya masa menunggu semua operasi menyekat. Untuk memastikan panggilan balik dan pengendalian ralat bersih, kami menggunakan Langkah untuk mengawal aliran.

7.Liberalisasi sesi

LinkedIn Mudah Alih menggunakan rangka kerja Express untuk mengurus kitaran permintaan/tindak balas. Banyak contoh nyata termasuk konfigurasi berikut:

app.use(express.session({ rahsia: "keyboard cat" }));
Secara lalai, data sesi disimpan dalam memori, yang menambah overhed yang besar kepada pelayan, terutamanya apabila bilangan pengguna meningkat. Anda boleh menggunakan stor sesi luaran, seperti MongoDB atau Redis, tetapi setiap permintaan akan menanggung overhed panggilan jauh untuk mendapatkan semula data sesi. Jika boleh, pilihan terbaik adalah untuk menyimpan semua data tanpa kewarganegaraan di bahagian pelayan. Dengan mengosongkan sesi dengan tidak memasukkan konfigurasi ekspres di atas, anda akan melihat prestasi yang lebih baik.

8. Menggunakan modul binari

Jika boleh, gantikan modul JavaScript dengan modul binari. Sebagai contoh, apabila kita beralih daripada modul SHA yang ditulis dalam JavaScript kepada versi yang disusun untuk Node.js, kita melihat lonjakan prestasi yang besar:

// Use built in or binary modules
var crypto = require('crypto');
var hash = crypto.createHmac("sha1",key).update(signatureBase).digest("base64");

9 Gantikan pustaka klien dengan JavaScript V8 standard

Banyak perpustakaan JavaScript dicipta untuk digunakan pada penyemak imbas web kerana persekitaran JavaScript berbeza: contohnya, sesetengah penyemak imbas menyokong fungsi seperti forEach, memetakan dan mengurangkan, tetapi sesetengah penyemak imbas tidak. Jadi perpustakaan pelanggan sering menggunakan banyak kod yang tidak cekap untuk mengatasi perbezaan pelayar. Dalam Node.js, sebaliknya, anda tahu dengan tepat kaedah JavaScript yang sah: enjin JavaScript V8 menyokong pelaksanaan ECMAScript Node.js seperti yang dinyatakan dalam ECMA-262 Edisi Ke-5. Hanya gantikan perpustakaan pelanggan dengan fungsi JavaScript V8 standard dan anda akan melihat peningkatan prestasi yang ketara.

10. Pastikan kod anda kecil dan ringan

Menggunakan peranti mudah alih boleh menyebabkan akses perlahan dan kependaman tinggi, yang memberitahu kami untuk memastikan kod kami kecil dan ringan. Kekalkan falsafah yang sama untuk kod pelayan juga. Sekali-sekala lihat kembali keputusan anda dan tanya diri anda soalan seperti: "Adakah kita benar-benar memerlukan modul ini?", "Mengapa kita menggunakan rangka kerja ini, dan adakah overhead berbaloi?", "Bolehkah kita menggunakan cara yang lebih mudah? " Kod yang lebih kecil dan lebih ringan biasanya lebih cekap dan lebih pantas.

Cubalah

Kami bekerja keras untuk menjadikan apl mudah alih kami pantas. Cubalah pada apl iPhone, apl Android dan versi mudah alih HTML5 dan beritahu kami cara anda melakukannya.

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