openplanning

Tìm hiểu về Event Loop trong NodeJS

  1. Tổng quan về NodeJS Event Loop

1. Tổng quan về NodeJS Event Loop

NodeJS là một ứng dụng đơn luồng (Single Thread), nó hoạt động phía trên một nền tảng được viết bởi C++, nền tảng này sử dụng đa luồng (Multi-Thread) để thực hiện đồng thời các nhiệm vụ.
Hình dưới đây minh họa các yêu cầu (request) từ phía các người dùng gửi đến máy chủ NodeJS.
Mỗi yêu cầu (request) từ phía người dùng được NodeJS coi là một sự kiện (event), chúng được đặt vào một Event Queue (Hàng đợi sự kiện). NodeJS sử dụng quy tắc FIFO (First In First Out), điều này có nghĩa là những yêu cầu đến trước sẽ được xử lý trước.
Event Loop
Là một vòng lặp vô tận, nó sẽ chuyển các yêu cầu sang Thread Pool (Bể chứa các luồng), đồng thời mỗi yêu cầu sẽ được đăng ký một hàm Callback. Khi một yêu cầu được xử lý xong, hàm Callback tương ứng sẽ được gọi thực thi.
Thread Pool
Là một chương trình viết bằng ngôn ngữ C++, nó hỗ trợ đa luồng (Multi Threads), chính vì vậy tại đây các yêu cầu sẽ được xử lý trên các luồng khác nhau. NodeJS cũng hỗ trợ đa tiến trình (Multi Processes), điều này có nghĩa là chúng có thể được thực thi trên các lõi (Core) khác nhau.
Khi một yêu cầu được xử lý xong, NodeJS sẽ gọi hàm Callback (Đã được đăng ký cho yêu cầu này) để thực thi nó.
CÁC KẾT LUẬN:
Kết luận cơ bản thứ nhất: Nếu mỗi kết nối tới Server đều mở ra một luồng (Thread) sẽ rất tốn bộ nhớ. Điều này đã được chứng thực khi bạn so sánh ApacheNginx (Hai Web Server triển khai các ứng dụng PHP). Apache đã tiêu tốn bộ nhớ khủng khiếp hơn rất nhiều so với Nginx.
NodeJS giống với Nginx là chúng chỉ sử dụng một luồng đơn (Single thread) để đón tiếp các kết nối từ phía người dùng, và coi mỗi yêu cầu của người dùng là một sự kiện.
Kết luận cơ bản thứ hai: Các hoạt động I/O rất tốn tài nguyên của hệ thống, vì vậy NodeJS quản lý chặt chẽ việc sử dụng các hoạt động I/O. Vì vậy bạn chỉ cần sử dụng Callback khi bạn thực thi các nhiệm vụ liên quan tới I/O.
Về cơ bản rất nhiều thứ trong NodeJS đang chạy song song trên các luồng khác nhau, nhưng chúng được quản lý trực tiếp bởi NodeJS, chẳng hạn như Thread Pool. Còn những gì bạn viết ra được chạy trên một luồng đơn (single thread).