+11

Node JS Architecture – Single Threaded Event Loop

I. NodeJS Architecture

1. Node JS Single Threaded Event Loop Model

  • Các ứng dụng Node JS sử dụng kiến trúc "Single Threaded Event Loop Model" để xử lý đồng thời rất nhiều clients.
  • Hiện nay có rất nhiều công nghệ ứng dụng web như JSP, Spring MVC, ASP.NET, HTML, Ajax, jQuery etc. Nhưng tất cả những công nghệ đó đều theo kiến trúc "Multi-Threaded Request-Response".
  • Chúng ta đã quá quen thuộc với "Multi-Threaded Request-Response" vì chúng được sử dụng bởi hầu hết các web application frameworks. Nhưng tại sao NodeJS chọn kiểu kiến trúc khác để phát triển các ứng dụng web. Sự khác biệt chính là ở "Multi-Threaded Request-Response" và "Single Threaded Event Loop Model".
  • Chúng ta đều có thể học NodeJS và phát triển ứng dụng dễ dàng. Tuy nhiên, bỏ qua sự hiểu biết về NodeJS bên trong nó hoạt động ra sao, chúng ta sẽ không thể tự thiết kế và phát triển các ứng dụng node 1 cách tốt được. Vì vậy, trước khi phát triển nó, hãy học xem cách nó hoạt động ra làm sao.

2. Node JS Platform

  • Node JS Platform sử dụng kiến trúc "Single Threaded Loop" để xử lý đồng thời nhiều clients. Làm thế nào nó thực sự xử lý các requests của clients một cách đồng thời mà không sử dụng multiple threads. Mô hình Event Loops là gì? Chúng ta sẽ thảo luận từng khái niệm này.
  • Trước khi thảo luận về kiến trúc "Single Threaded Loop", đầu tiên chúng ta sẽ đi qua kiến trúc "Multi-Threaded-Request".

3.Traditional Web Application Processing Model

  • Bất kỳ ứng dụng Web nào được phát triển ngoài Node JS, thường theo mô hình "Multi-Threaded Request-Response". Đơn giản chúng ta có thể gọi nó là mô hình Request/Response.
  • Clients gửi yêu cầu đến server, sau đó server xử lý một vài tiến trình dựa trên request từ phía clients, chuẩn bị response và gửi lại cho clients.
  • Mô hình này sử dụng giao thức HTTP. Vì HTTP là một giao thức Stateless, mô hình Request/Response này cũng là mô hình Stateless. Vì vậy chúng ta có thể gọi nó là Request / Response Stateless Model.
  • Tuy nhiên, mô hình này sử dụng nhiều threads để xử lý yêu cầu của khách hàng đồng thời. Trước khi thảo luận về mô hình này, trước tiên hãy đi qua biểu đồ dưới đây.

Request/Response Model Processing Steps:

Clients gửi yêu cầu tới Web Server.

  • Web Server duy trì một Limited Thread pool để cung cấp dịch vụ cho các request của clients.
  • Web Server đang ở trong Loop vô hạn và chờ đợi request từ phía clients.
  • Web Server nhận được những request đó.
    • Web Server chọn 1 yêu cầu từ phía clients
    • Pickup một Thread từ Thread pool
    • Gán Thread này cho request của clients
    • Thread này sẽ đọc yêu cầu của clients, xử lý yêu cầu của client, thực hiện bất kỳ Blocking IO nào (nếu cần) và chuẩn bị phản hồi
    • Thread này gửi phản hồi trở lại Web Server
    • Web Server lần lượt gửi phản hồi này đến Client tương ứng.

Web Server đợi trong vòng lặp vô hạn và thực hiện tất cả các bước phụ như đã đề cập ở trên cho tất cả n Clients. Điều đó có nghĩa là mô hình này tạo ra một Thread per Client.

Nếu nhiều request của client yêu cầu Blocking IO Operations, thì hầu như tất cả các Thread đều bận rộn trong việc chuẩn bị phản hồi. Các request clients còn lại sẽ phải chờ trong một khoảng thời gian.

Drawbacks of Request/Response Stateless Model

  • Xử lý đồng thời nhiều yêu cầu của clients gặp một chút khó khăn.
  • Khi yêu cầu clients đồng thời tăng, sẽ sử dụng nhiều hơn nữa các thread => tốn bộ nhớ
  • Đôi khi, yêu cầu của clients sẽ phải đợi các thread có sẵn để xử lý các yêu cầu đó.
  • Lãng phí thời gian trong việc xử lý Blocking IO Tasks.

4. Node JS Architecture – Single Threaded Event Loop

Node JS Platform không theo mô hình Request/Response Multi-Threaded Stateless. Nó tuân theo mô hình Single Threaded with Event Loop. Mô hình chính Node JS Processing dựa trên mô hình cơ bản Javascript Event với cơ chế Javascript callback.

Khi Node JS đi theo kiến trúc này, nó có thể xử lý được đồng thời nhiều yêu cầu của clients rất dễ dàng. Trước khi thảo luận về mô hình này, trước tiên hãy đi qua biểu đồ dưới đây.

Trái tim của mô hình Node JS Processing là "Event Loops". Nếu chúng ta hiểu điều này, thì rất dễ hiểu các Node JS Internals.

Các bước xử lý mô hình vòng lặp sự kiện đơn Threaded:

  • Clients gửi yêu cầu tới Web Server.
  • Node JS Web Server duy trì một Limited Thread Pool để cung cấp dịch vụ cho các yêu cầu của clients.
  • Node JS Web Server nhận được các yêu cầu đó và đưa chúng vào hàng đợi. Nó được hiểu như là là "Event Queue".
  • Node JS Web Server nội bộ có một Components, gọi là "Event Loop". Tại sao nó có tên này là vì nó sử dụng vòng lặp vô hạn để nhận yêu cầu và xử lý chúng.
  • Event Loop sử dụng một Single Thread duy nhất. Đó là trọng tâm của mô hình Node JS Platform Processing Model.
  • Event Loop kiểm tra bất kỳ client request nào được đặt trong Event Queue. Nếu không, nó sẽ chờ các request đến.
  • Nếu có, nó chọn một yêu cầu client từ Event Queue
    • Bắt đầu quá trình yêu cầu của client.
    • Nếu client request không yêu cầu bất kỳ Blocking IO Operations, thì xử lý mọi thứ và chuẩn bị phản hồi và gửi lại cho client.
    • Nếu client request yêu cầu một số Blocking IO Operations như tương tác với cơ sở dữ liệu, file systems, extenal services thì nó sẽ theo cách tiếp cận khác.
      • Kiểm tra các Thread có sẵn từ Internal Thread Pool
      • Chọn một Thread và chỉ định request client này cho Thread đó.
      • Thread này chịu trách nhiệm lấy request đó, xử lý nó, thực hiện các Blocking IO Operations, chuẩn bị phản hồi và gửi nó trở lại Event Loop
      • Event Loop lần lượt gửi phản hồi cho client tương ứng.

Node JS Architecture – Single Threaded Event Loop Advantages

  • Xử lý đồng thời nhiều yêu cầu của client rất dễ dàng.
  • Mặc dù ứng dụng Node JS của chúng ta nhận nhiều yêu cầu của client đồng thời hơn, nhưng lại không cần phải tạo thêm nhiều Thread vì Event Loop.
  • Node JS application sử dụng ít Threads để nó có thể sử dụng ít tài nguyên hoặc bộ nhớ hơn.

Event Loop Pseudo Code

public class EventLoop {
while(true){
        	if(Event Queue receives a JavaScript Function Call){
        		ClientRequest request = EventQueue.getClientRequest();
                            If(request requires BlokingIO or takes more computation time)
                                    Assign request to Thread T1
                            Else
                                  Process and Prepare response
                  }
            }
} 
  • Đây là tất cả về Node JS Architecture và Node JS single threaded event loop.

5. Tài liệu tham khảo https://www.journaldev.com/7462/node-js-architecture-single-threaded-event-loop


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí