Saya telah belajar dan menggunakan Node.js selama dua bulan. Saya telah menggunakan Express dan dikombinasikan dengan Mongoose untuk menulis aplikasi web dan satu set API Web REST. Melihat kembali perkenalan Node.js di beranda situs web resmi Node.js: Node.js menggunakan model I/O yang dibawa ke acara, yang membuatnya ringan dan efisien. Jadi apa arti model I/O non-blocking?
Model IO non-blocking
Pertama-tama, operasi IO tidak diragukan lagi memakan waktu. Ketika server menerima sejumlah besar permintaan, membuat proses atau utas untuk setiap permintaan juga menambahkan overhead memori tambahan, dan dapat membuang lebih banyak waktu dan sumber daya.
Karena Node.js didorong oleh acara, ia menggunakan loop acara untuk menyelesaikan masalah kemacetan yang disebabkan oleh operasi IO. Di Node.js, operasi IO biasanya memiliki fungsi panggilan balik. Ketika operasi IO selesai dan kembali, fungsi callback akan dipanggil, dan utas utama terus menjalankan kode berikut. Mari kita ilustrasikan secara singkat masalah ini dengan sebuah contoh:
request ('http://www.google.com', function (error, response, body) {console.log (body);}); console.log ('selesai!');Kode ini berarti mengeluarkan permintaan ke 'http://www.google.com', dan ketika permintaan mengembalikan fungsi panggilan balik ini, informasi responsnya adalah output. Karena mekanisme node.js yang sedang berjalan, setelah kode ini dijalankan, itu akan segera menghasilkan 'selesai!' pada konsol, dan kemudian output informasi respons setelah periode waktu tertentu.
Loop acara loop acara
Selanjutnya, mari kita bahas mekanisme loop acara. Pertama, mari kita bicara tentang panggilan, misalnya, ada kode berikut:
fungsi a (arg, func) {var a = arg; func (); console.log ('a'); } function b () {console.log ('b');} a (0, b);Setelah kode dieksekusi, fungsi A pertama kali didorong ke dalam panggilan dan menjadi elemen teratas dari tumpukan dan mulai mengeksekusi A. Selama proses eksekusi, fungsi B didorong ke dalam panggilan dan menjadi elemen teratas dari tumpukan. Setelah B dieksekusi, B muncul dan dipanggil, dan A menjadi elemen teratas dari tumpukan lagi. Setelah A dieksekusi, A muncul dan dipanggil, dan panggilannya menganggur.
Ada antrian pesan dalam runtime JavaScript, dan pesan tersebut dikaitkan dengan fungsi callback. Ketika suatu peristiwa dipicu, jika acara tersebut memiliki fungsi panggilan balik yang sesuai, pesan akan ditambahkan ke antrian pesan.
Mari kita bicara tentang apa loop acara itu. Setelah kode mulai dieksekusi, fungsi terus didorong ke dalam panggilan. Ambil contoh di atas. Permintaan didorong ke dalam panggilan, dan fungsi ini akan membuat permintaan HTTP (permintaan HTTP ini akan diserahkan ke modul yang mendasari Node.js) dan acara selesai pada saat yang sama dikaitkan dengan fungsi callback. Permintaan muncul dan dipanggil, dan Console.log didorong ke panggilan untuk memulai eksekusi. Ketika permintaan selesai, acara penyelesaian dipicu dan pesan ditambahkan ke antrian pesan. Antrian pesan pertama -tama memeriksa apakah panggilan itu menganggur. Jika panggilan tidak menganggur, itu akan menunggu sampai panggilan menganggur dan muncul di kepala antrian pesan. Pada saat ini, fungsi panggilan balik yang terkait dengan pesan dieksekusi.
ringkasan
Di atas adalah ringkasan konseptual dari model non-blocking dan loop acara. Mekanisme loop peristiwa ini tidak hanya unik untuk node.js, dan kode node.js dieksekusi oleh satu utas. Apa keuntungannya saat menghadapi sejumlah besar permintaan bersamaan?
Gambar di atas menunjukkan diagram arsitektur Node.js. Ada modul di lapisan yang mendasari Node.js bertanggung jawab untuk memelihara kumpulan utas. Ketika permintaan IO dikeluarkan, lapisan Node.js yang mendasari akan membuat utas baru untuk memproses permintaan, dan kemudian mengembalikan hasilnya ke lapisan atas setelah selesai. Kemudian, ketika ada beberapa permintaan, modul yang mendasari Node.js akan menggunakan sesedikit mungkin utas untuk menyelesaikan tugas terbanyak. Jika ada utas gratis, itu akan terus digunakan untuk melakukan hal -hal lain. Ini tidak diragukan lagi jauh lebih pintar dan lebih efisien untuk pembukaan proses atau utas baru untuk setiap permintaan seperti yang disebutkan sebelumnya.
Artikel ini adalah ringkasan dari pembelajaran node.js. Jika ada masalah atau kekurangan, kritik dan koreksi dipersilakan.