Memahami Cara Kerja Arsitektur Node.js

Ketika Client mengirimkan Tugas/Permintaan ke aplikasi NodeJS, permintaan tersebut akan dikirim ke Antrian dan akan diproses setiap Antrian yang datang, karena NodeJS menggunakan Single Thread, dan dampaknya adalah setiap Permintaan yang masuk ke aplikasi NodeJS akan disimpan dalam antrian sebelum dieksekusi.

Event Loop akan melakukan proses dan setelah itu akan mengirimkan pekerjaan proses ke C++ Threadpool dimana sebenarnya kode program akan dieksekusi di C++ Threadpool, misalnya untuk Sumber Daya Eksternal seperti koneksi ke file, database dll, prosesnya akan dieksekusi di dalam C++ Threadpool dan setelah proses selesai, mereka akan melakukan Callback dan akan diterima oleh Event Loop kemudian akan mengirimkan Respons ke Client.

Secara default, NodeJS menggunakan single thread yang merupakan sifat dasarnya. tetapi jika kita lihat di latar belakang ada thread yang membantu yang disebut C++ Threadpool. Jadi, jika kita melihat diagram di bawah, kita bisa melihat Single Thread tetapi jika kita lihat secara keseluruhan tidak hanya single thread karena ada Threadpool juga untuk membantu proses eksekusi.

Arsitektur Event-Driven

Event-Loop

  • Event-loop adalah proses single thread yang digunakan untuk mengeksekusi kode Non-Blocking. NodeJS merekomendasikan jika kita membuat kode, harus Non-Blocking.
  • Karena Event-Loop hanya menggunakan single thread, kita harus berhati-hati saat membuat kode blocking, karena dapat memperlambat eksekusi kode, mereka akan sibuk mengelola kode blocking, mereka tidak punya waktu untuk mengeksekusi kode lain.
  • Tugas Event-Loop hanya menerima dan mengirim kode eksekusi ke C++ Threadpool, itulah mengapa kita harus menggunakan kode Non-Blocking karena proses blocking akan dilakukan di dalam C++ Threadpool.
  • Event-Loop akan menerima respons dari C++ threadpool yang dikirim melalui callback.

C++ Threadpool / Worker Threadpool

  • NodeJS menggunakan C++ Threadpool untuk eksekusi kode worker.
  • Threadpool di dalam NodeJS menggunakan library Libuv dimana secara default Libuv menggunakan 4 thread di dalam Threadpool, ini membuat kita dapat melakukan 4 worker blocking dalam satu waktu. Jika kita mengirim 4 permintaan, mereka dapat dieksekusi secara parallel bersama-sama, tetapi jika kita mengirim 6 permintaan hanya 4 permintaan yang akan dieksekusi, 2 permintaan akan menunggu di Antrian.
  • Jika ada terlalu banyak worker blocking, kita dapat mengubah jumlah thread di Libuv, jika kita ingin menggunakan lebih banyak thread, di dalam pengaturan variabel lingkungan UV_THREADPOOL_SIZE secara default menggunakan 4 thread, tetapi kita dapat mengubahnya, misalnya karena kode blocking kita akan digunakan untuk enkripsi kita ingin meningkatkan ke 40 thread, tetapi pertimbangkan dampaknya akan menggunakan memori yang lebih besar.