Gambar 1 Node.JS Architecture
Arsitektur Node.js mengacu pada cara kerja dan struktur internal Node.js yang memungkinkan aplikasi untuk berjalan dengan efisien dan mampu menangani banyak permintaan secara bersamaan. Berikut adalah hal yang perlu kalian ketahui tentang arsitektur Node.js, yaitu:
V8 Engine adalah mesin JavaScript open-source yang dikembangkan oleh Google. Ini merupakan komponen inti dalam arsitektur Node.js yang bertanggung jawab untuk menjalankan kode JavaScript dengan cepat dan efisien. Berikut adalah penjelasan singkat tentang V8 Engine dalam konteks Node.js:
a. Kompilasi Just-In-Time (JIT)
V8 Engine menggunakan pendekatan kompilasi JIT (Just-In-Time) untuk menjalankan kode JavaScript. Saat aplikasi Node.js berjalan, V8 akan menganalisis dan mengompilasi kode JavaScript menjadi kode mesin yang dapat dijalankan secara efisien. Ini memungkinkan kinerja yang cepat dan optimal dalam menjalankan kode JavaScript.
b. Memory Management
V8 Engine memiliki sistem manajemen memori yang canggih. Ini termasuk pengelolaan alokasi memori, penghapusan objek yang tidak lagi digunakan (garbage collection), dan pemantauan penggunaan memori secara keseluruhan. Hal ini membantu mencegah terjadinya kebocoran memori (memory leaks) dan memastikan penggunaan memori yang efisien oleh aplikasi Node.js.
c. Optimasi Kode
V8 Engine menggunakan teknik optimasi seperti inlining, inline caching, dan adaptive optimization untuk meningkatkan kinerja kode JavaScript. Selama eksekusi aplikasi, V8 Engine secara dinamis menganalisis pola penggunaan dan karakteristik kode JavaScript untuk melakukan optimasi yang lebih baik. Ini termasuk mengubah kode JavaScript menjadi bentuk yang lebih cepat dan mengurangi overhead eksekusi.
Contoh penerapan V8 Engine dalam Node.js dapat dilihat dalam penggunaan sintaks dan fitur-fitur JavaScript modern yang didukung oleh V8 Engine. Misalnya, Node.js memungkinkan penggunaan sintaks arrow function, destructuring assignment, async/await, dan sebagainya, yang didukung oleh V8 Engine.
Gambar 2 Arrow function pada V8 engine.
Pada program di gambar 2, arrow function digunakan untuk mendefinisikan function sayHello, dan kemudian function tersebut dipanggil. Function tersebut akan dijalankan oleh V8 Engine dalam Node.js, yang mendukung sintaks arrow function tersebut.
Event loop merupakan komponen utama dalam arsitektur Node.js. Ia bertanggung jawab untuk mengeksekusi kode JavaScript secara non-blokir (non-blocking) dan asinkron (asynchronous). Event loop terus berjalan di belakang layar dan memantau antrian peristiwa (event queue) untuk menangani peristiwa-peristiwa yang terjadi, seperti permintaan HTTP, operasi I/O, atau timer. Event loop bekerja dengan prinsip "loop" di mana ia berulang kali memeriksa antrian peristiwa, mengeksekusi kode yang sesuai, dan mengembalikan hasilnya.
Pada dasarnya, Event Loop berfungsi untuk menerima tugas-tugas asynchronous seperti input pengguna, operasi I/O, atau permintaan jaringan, dan mengatur bagaimana tugas-tugas tersebut dijalankan tanpa harus memblokir (block) eksekusi program. Dengan menggunakan pendekatan asynchronous, Node.js dapat menjalankan banyak tugas secara efisien tanpa harus menunggu penyelesaian tugas sebelumnya.
Berikut adalah tahapan-tahapan yang terjadi dalam Event Loop pada arsitektur Node.js:
a. Pemrosesan Tugas Synchronous
Event Loop dimulai dengan pemrosesan tugas-tugas synchronous yang ada dalam program. Tugas-tugas ini akan dieksekusi secara langsung tanpa menunggu operasi I/O atau tugas asynchronous lainnya.
b. Pemrosesan Tugas Asynchronous
Setelah selesai dengan tugas synchronous, Event Loop akan memeriksa antrian tugas asynchronous yang telah selesai dieksekusi. Tugas-tugas ini dapat berasal dari operasi I/O, callback dari fungsi asynchronous, atau event lainnya. Event Loop akan mengambil tugas-tugas tersebut dan menjadwalkannya untuk dieksekusi.
c. Pemrosesan Tugas Timers
Selain tugas-tugas asynchronous, Event Loop juga memeriksa tugas-tugas yang terkait dengan timers seperti setTimeout atau setInterval. Jika ada tugas-tugas timer yang sudah mencapai waktu yang ditentukan, Event Loop akan menjadwalkannya untuk dieksekusi.
d. Penjagaan Kejadian I/O
Event Loop juga mengawasi kejadian I/O seperti permintaan jaringan atau operasi disk. Ketika permintaan I/O selesai atau terjadi kejadian lainnya, Event Loop akan mengambil tugas terkait dan menjadwalkannya untuk dieksekusi.
e. Mengulangi Proses
Setelah tahapan-tahapan sebelumnya, Event Loop akan mengulangi prosesnya secara terus-menerus. Ini berarti Event Loop akan terus memeriksa tugas-tugas synchronous, tugas-tugas asynchronous yang telah selesai, tugas-tugas timer, dan kejadian I/O, dan menjadwalkannya untuk dieksekusi.
Contoh penggunaan Event Loop dapat dilihat dalam kode berikut:
Gambar 3 Penerapan async pada event loop.
Pada program di gambar 3, terdapat dua tugas asynchronous menggunakan setTimeout. Setiap tugas akan dieksekusi setelah waktu tertentu (dalam milidetik) sesuai dengan parameter yang diberikan. Hal ini terjadi karena Event Loop akan menjalankan tugas-tugas synchronous terlebih dahulu, yaitu mencetak "Start" dan "End". Setelah itu, Event Loop akan menjalankan tugas-tugas asynchronous dari setTimeout, dimulai dari yang paling cepat.
Callback Queue (juga dikenal sebagai Task Queue) adalah salah satu komponen dalam Event Loop pada Node.js. Callback Queue bertugas menyimpan tugas-tugas (callback functions) yang sudah selesai dieksekusi oleh worker threads atau operasi I/O asynchronous. Tugas-tugas ini akan diproses oleh Event Loop setelah tugas-tugas synchronous selesai dieksekusi.
Thread pool adalah komponen dalam arsitektur Node.js yang bertanggung jawab untuk mengelola kumpulan thread yang digunakan untuk menjalankan tugas-tugas asynchronous. Thread pool memungkinkan Node.js untuk secara efisien menangani banyak permintaan secara bersamaan tanpa harus membuat thread baru untuk setiap permintaan.
Node.js menggunakan model single-threaded, artinya ada satu thread utama yang menjalankan kode JavaScript. Namun, untuk menangani operasi I/O blocking seperti akses ke sistem file atau panggilan jaringan, Node.js menggunakan thread pool yang terdiri dari beberapa thread tambahan. Thread pool ini berfungsi untuk menjalankan tugas-tugas I/O blocking secara asynchronous, sehingga thread utama tetap dapat menjalankan kode JavaScript lainnya tanpa harus terblokir.
Contoh sederhana untuk memahami thread pool adalah dengan menggunakan modul fs untuk membaca file:
Gambar 4 Penerapan thread pool meggunakan modul fs.
Pada program di gambar 4, kita menggunakan fs.readFile untuk membaca isi dari file.txt secara asynchronous. Operasi ini akan dibebankan ke thread pool, dan thread utama akan melanjutkan eksekusi kode selanjutnya tanpa harus menunggu operasi I/O selesai. Thread pool akan menjalankan tugas membaca file secara asynchronous di thread-thread yang ada dalam pool. Setelah selesai, callback function akan dipanggil dan dijadwalkan untuk dieksekusi oleh Event Loop.
Gambar 5. Pengenalan non-blocking I/O.
Dalam pengembangan aplikasi, seringkali terjadi operasi I/O (Input/Output) seperti membaca atau menulis ke file atau jaringan yang memakan waktu yang cukup lama. Non-blocking I/O (Input/Output) pada Node.js adalah sebuah konsep yang memungkinkan operasi I/O seperti membaca atau menulis ke file atau jaringan dilakukan secara asynchronous tanpa memblokir eksekusi program utama. Dalam konteks Node.js, I/O operations yang umumnya membutuhkan waktu yang lama seperti membaca atau menulis file, mengirim permintaan ke server, atau menerima respons dari server, tidak akan menghentikan atau memperlambat eksekusi kode selanjutnya.
Pada saat melakukan operasi I/O, Node.js akan meneruskan permintaan tersebut ke sistem operasi dan melanjutkan eksekusi program ke bagian selanjutnya tanpa harus menunggu operasi I/O selesai. Saat operasi I/O selesai, Node.js akan mengaktifkan callback untuk menangani hasil operasi tersebut.
Keuntungan dari non-blocking I/O adalah sebagai berikut:
Karena operasi I/O dapat dilakukan secara asynchronous tanpa memblokir eksekusi program, Node.js dapat menangani banyak permintaan secara efisien dengan sedikit sumber daya.
Dengan non-blocking I/O, operasi yang membutuhkan waktu lama seperti membaca file besar atau mengirim permintaan jaringan tidak akan menghentikan proses utama. Hal ini memungkinkan aplikasi terus berjalan dan merespons permintaan lainnya secara efektif.
Dalam model non-blocking I/O, aplikasi dapat terus berjalan dan merespons permintaan baru, bahkan saat operasi I/O masih dalam proses. Hal ini membuat aplikasi terasa lebih responsif dan pengguna dapat melihat hasil yang diperoleh secara lebih cepat.
Gambar 6. Contoh penggunaan non-blocking I/O.
Pada program di gambar 6, kita menggunakan modul fs (file system) bawaan Node.js untuk membaca file. Fungsi readFile digunakan untuk membaca file secara asynchronous. Ketika kita memanggil function ini, Node.js tidak akan memblokir eksekusi program utama, melainkan akan melanjutkan ke baris kode selanjutnya.
Setelah file selesai dibaca, callback function akan diaktifkan dengan memberikan hasil bacaan atau error (jika ada). Callback function ini akan dipanggil secara asynchronous ketika operasi I/O selesai.
Dalam contoh ini, setelah kita memanggil readFile ,program akan melanjutkan ke baris console.log('Program berjalan tanpa terblokir') tanpa harus menunggu file selesai dibaca. Hal ini memungkinkan program tetap berjalan dan merespons permintaan lainnya tanpa terhenti atau terblokir oleh operasi I/O yang membutuhkan waktu lama.
Gambar 7. Pengenalan SPA.
Single Page Application (SPA) adalah jenis implementasi aplikasi web yang dapat dilakukan menggunakan Node.js. Node.js adalah platform runtime JavaScript yang dirancang untuk membangun aplikasi jaringan skala besar, dan salah satu keunggulan Node.js adalah kemampuannya dalam mengembangkan aplikasi berbasis server.
Dalam konteks SPA, Node.js dapat digunakan untuk menyediakan server backend yang melayani permintaan dari aplikasi web SPA. Node.js memiliki kemampuan untuk menangani permintaan HTTP dan menyediakan API yang digunakan oleh aplikasi frontend.
Pada implementasi SPA dengan Node.js, server backend yang dibangun dengan Node.js bertugas untuk menyediakan data dan fungsi yang dibutuhkan oleh aplikasi SPA. Misalnya, server dapat menangani permintaan untuk mengambil data dari database, melakukan operasi pengolahan data, dan memberikan respons dalam format yang diperlukan oleh aplikasi frontend.
Keunggulan SPA dalam implementasi Node.js adalah sebagai berikut:
Dengan menggunakan Node.js sebagai platform runtime, pengembangan aplikasi SPA dapat dilakukan dengan pendekatan server-side rendering atau client-side rendering. Dalam server-side rendering, Node.js dapat menghasilkan HTML awal yang sudah di-render di sisi server, sehingga mengurangi waktu yang dibutuhkan untuk rendering di sisi klien. Dalam client-side rendering, Node.js berperan sebagai server yang menyediakan API dan logika bisnis, sementara rendering UI dilakukan di sisi klien. Hal ini memungkinkan aplikasi SPA memiliki responsivitas yang tinggi karena proses rendering yang lebih cepat.
Node.js diketahui memiliki kemampuan untuk menangani banyak koneksi secara simultan dengan model non-blocking I/O dan event-driven. Ini membuatnya cocok untuk menghadapi lalu lintas tinggi pada aplikasi SPA yang melayani banyak pengguna. Node.js juga dapat dijalankan dalam mode cluster untuk memanfaatkan beberapa inti CPU yang tersedia, meningkatkan kapasitas aplikasi secara horizontal.
Node.js memungkinkan penggunaan JavaScript di kedua sisi, baik di sisi server maupun di sisi klien. Ini memungkinkan pengembang untuk membagikan dan menggunakan kode bersama antara sisi server dan sisi klien, seperti validasi data, pengolahan logika bisnis, dan validasi formulir. Hal ini mengurangi duplikasi kode dan mempermudah pemeliharaan aplikasi.
Node.js memiliki ekosistem yang luas dan aktif, termasuk banyak modul dan framework yang mendukung pengembangan aplikasi SPA. Ada banyak pustaka JavaScript dan alat bantu yang tersedia untuk mempercepat proses pengembangan dan meningkatkan produktivitas pengembang.
Dengan memanfaatkan
keunggulan-keunggulan di atas, implementasi Node.js dalam pembangunan aplikasi
SPA dapat memberikan pengalaman pengguna yang lebih baik, responsif, dan
skalabel. Node.js menjadi pilihan yang populer bagi pengembang untuk membangun
aplikasi SPA yang efisien dan canggih.
Referensi