Berikut adalah 10 aturan kinerja yang kami ikuti saat menggunakan Node.js:
1. Hindari menggunakan kode sinkron
Dalam hal desain, node.js adalah satu utusan. Untuk mengizinkan satu utas untuk menangani banyak permintaan bersamaan, Anda tidak akan pernah bisa membiarkan utas menunggu untuk memblokir, sinkron, atau operasi jangka panjang. Fitur khas Node.js adalah bahwa ia dirancang dan diimplementasikan dari atas ke bawah untuk mencapai asinkron. Ini membuatnya sangat cocok untuk program tipe acara.
Sayangnya, masih ada kemungkinan bahwa panggilan sinkron/pemblokiran akan terjadi. Misalnya, banyak operasi sistem file memiliki versi sinkron dan asinkron, seperti WriteFile dan WriteFileSync. Bahkan jika Anda menggunakan kode untuk mengontrol metode sinkronisasi, masih dimungkinkan untuk menggunakan pustaka fungsi eksternal yang memblokir panggilan secara tidak sengaja. Saat Anda melakukan ini, dampak pada kinerja sangat besar.
// Bagus: Tulis file asynchronilyfs.writeFile ('message.txt', 'hello node', function (err) {console.log ("Ini disimpan dan server tetap responsif!");}); // Bad: Tulis file secara sinkronfs.writeFilesync ('message.txt', 'halo node'); console.log ("Ini disimpan, tetapi Anda baru saja memblokir semua permintaan!");Log inisialisasi kami secara tidak sengaja mencakup panggilan sinkron untuk menulis konten ke disk saat diimplementasikan. Jika kami tidak melakukan pengujian kinerja, akan mudah untuk mengabaikan masalah ini. Saat menggunakan instance node.js di kotak pengembang sebagai tes standar, panggilan sinkron ini akan menyebabkan kinerja turun dari ribuan permintaan per detik menjadi hanya beberapa lusin.
2. Tutup kolam soket
Klien HTTP Node.js 'akan secara otomatis menggunakan kumpulan soket: secara default, hanya akan membatasi 5 soket per host. Meskipun penggunaan kembali soket dapat menyebabkan peningkatan sumber daya yang terkendali, jika Anda perlu berurusan dengan permintaan bersamaan dari host yang sama, itu akan menyebabkan serangkaian kemacetan. Dalam hal ini, adalah ide yang baik untuk meningkatkan nilai maxsockets atau menutup kumpulan soket:
// Nonaktifkan Pooling Socket Var http = membutuhkan ('http'); var options = {.....}; options.agent = false; var req = http.Request (opsi)3. Jangan biarkan sumber daya statis menggunakan node.js
Untuk sumber daya statis seperti CSS dan gambar, gunakan server web standar alih -alih node.js. Misalnya, LinkedIn Mobile menggunakan Nginx. Kami juga menggunakan Networks Pengiriman Konten (CDN), yang dapat menyalin sumber daya statis di seluruh dunia ke server. Ini memiliki dua manfaat: (1) dapat mengurangi beban di Node.js Server kami (2) CDN dapat memungkinkan konten statis dikirimkan pada server yang lebih dekat ke pengguna, sehingga mengurangi waktu tunggu.
4. Render pada klien
Mari kita dengan cepat membandingkan perbedaan antara rendering server dan rendering klien. Jika kami menggunakan Node.js untuk diterjemahkan di sisi server, untuk setiap permintaan kami akan mengirimkan kembali halaman HTML seperti yang berikut:
<!-Contoh halaman web sederhana yang seluruhnya diterjemahkan sisi server-> <! Doctype html> <html> <head> <title> LinkedIn Mobile </title> </head> <body> <div> <mmg src = "http://mobile-cdn.linkedin.com/images/mages.link.link.link.link.link.link.link.link.link.link.link. </div> </body> </html>
Harap perhatikan mengamati semua konten halaman ini, kecuali untuk nama pengguna, sisanya statis: konten yang kelebihan beban oleh masing -masing pengguna dan halamannya sama. Oleh karena itu, pendekatan yang lebih efektif adalah membiarkan Node.js hanya mengembalikan konten dinamis yang diperlukan oleh halaman dalam bentuk JSON.
{"name": "John"}
Sisa halaman - semua tag HTML statis - dapat ditempatkan di templat JavaScript (seperti template underscore.js):
<!-Contoh templat JavaScript yang dapat diberikan sisi klien-> <! Doctype html> <html> <head> <title> LinkedIn Mobile </title> </head> <body> <div> <img src = "http://mobile-dn.linkedin.com/idimages/http://mobile-cdn.linkedin.com/mages/mages/pdn.pdn.linkedin.com/Images/IMAGES/IMAGES/LINK/HTTP: %>! </div> </body> </html>
Peningkatan kinerja berasal dari tempat -tempat ini: seperti yang dikatakan poin ketiga, templat javascript statis dapat disediakan di sisi server melalui server web (seperti nginx), atau diimplementasikan dengan CDN yang lebih baik. Selain itu, templat JavaScript dapat di -cache di browser atau disimpan secara lokal. Setelah semua halaman awal dimuat, satu -satunya data yang perlu dikirim ke klien adalah JSON, yang akan menjadi yang paling efektif. Metode ini dapat sangat mengurangi beban CPU, IO, dan Node.js.
5. Gunakan GZIP
Banyak server dan klien mendukung GZIP untuk mengompres permintaan dan jawaban. Apakah Anda menjawab klien atau mengirim permintaan ke server jarak jauh, pastikan untuk memanfaatkannya sepenuhnya.
6. Paralelisasi
Cobalah untuk membiarkan semua operasi pemblokiran Anda - Kirim permintaan, panggilan DB, dan paralelisasi akses sistem file ke layanan jarak jauh. Ini akan mengurangi waktu tunggu untuk operasi pemblokiran paling lambat, daripada waktu tunggu untuk semua operasi pemblokiran. Untuk menjaga panggilan balik dan penanganan kesalahan tetap bersih, kami menggunakan langkah untuk mengontrol lalu lintas.
7. Liberalisasi Sesi
LinkedIn Mobile menggunakan kerangka kerja ekspres untuk mengelola siklus permintaan/balasan. Banyak contoh tersurat termasuk konfigurasi berikut:
app.use (Express.Session ({Secret: "Keyboard Cat"}));
Secara default, data sesi disimpan dalam memori, yang menambahkan overhead besar ke server, terutama seiring dengan meningkatnya jumlah pengguna. Anda dapat menggunakan toko sesi eksternal, seperti MongoDB atau Redis, tetapi setiap permintaan akan menghasilkan overhead panggilan jarak jauh untuk mendapatkan data sesi. Jika memungkinkan, opsi terbaik adalah menyimpan semua data tanpa kewarganegaraan di sisi server. Dengan meliberalisasi sesi dengan tidak memasukkan konfigurasi ekspres di atas, Anda akan melihat kinerja yang lebih baik.
8. Gunakan modul biner
Jika memungkinkan, ganti modul JavaScript dengan modul biner. Misalnya, ketika kami mengonversi dari modul SHA yang ditulis dalam JavaScript ke versi Node.js yang dikompilasi, kami melihat lompatan besar ke depan dalam kinerja:
// Gunakan modul bawaan atau biner Crypto = membutuhkan ('crypto'); var hash = crypto.createhmac ("sha1", kunci) .update (SignatureBase) .gigest ("base64");9. Ganti Perpustakaan Klien dengan JavaScript V8 Standar
Banyak perpustakaan JavaScript dibuat untuk digunakan di browser web karena di lingkungan JavaScript, misalnya, beberapa browser mendukung fungsi seperti foreach, peta, dan mengurangi, tetapi beberapa browser tidak. Oleh karena itu, perpustakaan klien biasanya menggunakan banyak kode yang tidak efisien untuk mengatasi perbedaan browser. Di sisi lain, di Node.js, Anda dapat mengetahui persis metode JavaScript mana yang efektif: V8 JavaScript Engine mendukung Node.js untuk mengimplementasikan ecmascript yang ditentukan dalam edisi kelima ECMA-262. Secara langsung mengganti pustaka klien dengan fungsi JavaScript V8 standar, Anda akan menemukan peningkatan kinerja yang signifikan.
10. Jaga kode Anda kecil dan ringan
Menggunakan perangkat seluler akan membuat akses lambat dan latensi tinggi, yang memberitahu kami untuk menjaga kode kami tetap kecil dan ringan. Filosofi yang sama dipertahankan untuk kode server. Kadang -kadang melihat kembali keputusan Anda dan bertanya pada diri sendiri pertanyaan seperti: "Apakah kita benar -benar membutuhkan modul ini?", "Mengapa kita menggunakan kerangka kerja ini? Apakah overhead itu layak digunakan?", "Bisakah kita menerapkannya dengan cara yang sederhana?". Kode kecil dan ringan biasanya lebih efisien dan cepat.
Cobalah
Kami bekerja keras untuk membuat aplikasi seluler kami cepat. Cobalah di platform seperti aplikasi iPhone, aplikasi Android, dan versi seluler HTML5 untuk memberi tahu kami bagaimana keadaan kami.