Chúng tôi biết ứng dụng NodeJS là đơn luồng. Giả sử, nếu quá trình xử lý liên quan đến yêu cầu A mất 10 giây, điều đó không có nghĩa là yêu cầu xuất hiện sau yêu cầu này cần đợi 10 giây để bắt đầu xử lý vì vòng lặp sự kiện NodeJS chỉ là một luồng. Toàn bộ kiến trúc NodeJS không phải là đơn luồng.
NodeJS xử lý nhiều yêu cầu của khách hàng như thế nào?
NodeJS nhận nhiều yêu cầu của khách hàng và đặt chúng vào EventQueue. NodeJS được xây dựng với khái niệm kiến trúc hướng sự kiện. NodeJS có EventLoop riêng, đây là một vòng lặp vô hạn nhận yêu cầu và xử lý chúng. EventLoop là trình lắng nghe cho EventQueue.
Nếu NodeJS có thể xử lý yêu cầu mà không chặn I/O thì vòng lặp sự kiện sẽ tự xử lý yêu cầu và tự gửi phản hồi lại cho máy khách. Tuy nhiên, có thể xử lý song song nhiều yêu cầu bằng cách sử dụng mô-đun cụm NodeJS hoặc mô-đun worker_threads
Làm cách nào để mở rộng ứng dụng NodeJS của bạn với Mô-đun cụm?
Một phiên bản duy nhất của Node. js chạy trong một luồng duy nhất. Nếu bạn có một hệ thống đa lõi thì bạn có thể sử dụng mọi lõi. Đôi khi nhà phát triển muốn khởi chạy một cụm quy trình NodeJS để tận dụng lợi thế của hệ thống đa lõi
Mô-đun cụm cho phép dễ dàng tạo các quy trình con chia sẻ cùng một cổng máy chủ
Bước 1. Tạo một ứng dụng NodeJS và cài đặt Express cần thiết. mô-đun js
mkdir Project && cd Project npm init -y npm i express
Bước 2. Tạo một chỉ mục. js trên thư mục gốc của bạn với đoạn mã sau.
Javascript
_______46____47____48
node index.js9
node index.js0
node index.js8
node index.js0
node index.js1
node index.js2
node index.js3
node index.js4
node index.js5
node index.js6
node index.js7
node index.js8
node index.js9
node index.js10
node index.js9
node index.js12
node index.js9
node index.js14
node index.js15
node index.js16____117
node index.js9
node index.js19
node index.js9
node index.js21
node index.js9
node index.js23____224
node index.js25
node index.js16____227
node index.js9
node index.js29
node index.js19
node index.js61
_______462____463
node index.js9
node index.js65
node index.js9
node index.js67
node index.js9
node index.js69
node index.js16____471
_______116____473____474
node index.js75
node index.js16____477
node index.js9
node index.js29
node index.js19
Giải trình. Nếu hệ thống của bạn có 8 CPU thì 8 phiên bản NodeJS sẽ được tạo và mỗi phiên bản có vòng lặp sự kiện độc lập của riêng nó. Bây giờ NodeJS có thể xử lý song song tất cả các yêu cầu.
Tất cả đều chia sẻ cùng một cổng [PORT 3000] nhưng không có trạng thái. Quy trình tổng thể lắng nghe trên một cổng, chấp nhận các kết nối mới và phân phối chúng cho các công nhân theo kiểu vòng tròn, với một số tính năng thông minh tích hợp để tránh làm quá tải quy trình công nhân
Bước 3. Chạy chỉ mục. js bằng lệnh sau
node index.js
đầu ra
Sử dụng mô-đun worker_threads. Giải pháp tốt nhất cho hiệu năng của CPU là Worker Thread. Mô-đun này được sử dụng trong Nút. js vì nó hữu ích để thực hiện các tác vụ JavaScript nặng
Javascript là một ngôn ngữ lập trình với một bước ngoặt đặc biệt. Mô hình hướng sự kiện của nó có nghĩa là không có gì chặn và mọi thứ chạy đồng thời. Điều này không bị nhầm lẫn với kiểu chạy đồng thời giống như chạy song song trên nhiều lõi. Javascript là một luồng đơn nên mỗi chương trình chạy trên một lõi nhưng mọi dòng mã đều thực thi mà không cần đợi bất kỳ thứ gì trả về. Điều này nghe có vẻ kỳ lạ nhưng đó là sự thật. Nếu bạn muốn có bất kỳ loại thứ tự tuần tự nào, bạn có thể sử dụng các sự kiện, cuộc gọi lại hoặc lời hứa muộn
Hãy xem một ví dụ
node index.js2
Bây giờ bạn có thể tự hỏi setTimeout đang làm gì và về cơ bản, nó nói rằng hãy chạy chức năng này sau ngần ấy thời gian. Javascript là ngôn ngữ lập trình bậc cao, có nghĩa là bạn có thể chuyển các hàm dưới dạng đối số. Nhật ký bị trì hoãn đầu tiên sẽ in ra thiết bị xuất chuẩn sau 2 giây. Cái thứ hai sẽ in sau 1 giây
Những gì bạn có thể mong đợi để xem là
node index.js3
Nhưng không phải vậy, cả hai sẽ được kích hoạt lần lượt cùng lúc nên đầu ra sẽ như thế này
node index.js4
Cách truyền thống nhất để xử lý đồng thời khi bạn cần chạy các chức năng theo một thứ tự nhất định được gọi là gọi lại. Đây là khi bạn chuyển một hàm cho một hàm được chạy sau đó và đưa ra các đối số có thể được thực hiện sau đó. Đó là những gì setTimeout đang làm khi bạn truyền cho nó một hàm
node index.js5
Bây giờ hãy xem xét một số ví dụ thực tế về đồng thời. Chúng ta sẽ tạo một hàm gửi nhiều yêu cầu HTTP, đầu tiên là hàm thực hiện gọi lại và sau đó gọi hàm đó một cách tuần tự, đồng thời và cuối cùng là song song với sự trợ giúp của mô-đun cụm