[ITea] Node.JS là gì? Bạn đã hiểu hết về công nghệ tuyệt vời này? (Phần cuối)

chia sẻ 22/07/2021| 37

Bạn đã biết Node.JS là gì? Node.JS là một trong những công nghệ phổ biến nhất hiện nay để xây dựng API REST một cách mở rộng và hiệu quả. Nó cũng được sử dụng để xây dựng các app mobile hybrid, chương trình máy tính và thậm chí cả IoT.

Đây là bài đăng được tổng hợp những kinh nghiệm và kiến thức của những người đã làm việc với Node.JS từ những ngày đầu tiên. Hãy cùng đồng hành với Will & Way trong số tiếp theo của [ITea] – Node.JS, bạn đã hiểu hết về công nghệ tuyệt vời này?

 

JS và Event Loop

1. Về Node.JS

Node.js là nền tảng server-side được dựng trên Javascript Engine của Google Chrome (V8 Engine), nó sẽ biên dịch code Javascript thành Machine code.

Node.js sử dụng mô hình event-driven, non-blocking I/O chạy nhẹ và hiệu quả hơn. Node.js không phải là một Framework, nó không phải là một Thư viện, nó là một môi trường thời gian chạy.

Hãy viết một ví dụ nhanh:

2. Non- blocking I / O

Node.js là non-blocking I / O, nó có nghĩa là:

  1. Thread chính sẽ không bị chặn trong các hoạt động I / O.
  2. Server sẽ tiếp tục xử lý các yêu cầu.
  3. JS sẽ làm việc với các code không đồng bộ.

Hãy viết một ví dụ, trong mỗi yêu cầu / home, máy chủ sẽ gửi một trang HTML, nếu không thì máy chủ sẽ gửi văn bản ‘Hello World’. Để gửi trang HTML, trước tiên cần đọc tệp.

home.html

Index.js

Nếu url được yêu cầu là / home thì khi sử dụng mô-đun gốc fs, tệp được đọc là home.html.

Các hàm được chuyển tới http.createServer và fs.readFile được gọi là các hàm callbacks. Các function đó sẽ được thực hiện một lúc nào đó trong tương lai (chức năng đầu tiên khi máy chủ nhận được yêu cầu và chức năng thứ hai khi tệp đã được đọc và nội dung được lưu vào bộ đệm).

Trong khi đọc tệp Node.js vẫn có thể tham gia các yêu cầu, thậm chí đọc lại tệp, tất cả cùng một lúc trong một chuỗi duy nhất … nhưng làm thế nào?!

 

3. Event Loop

Event Loop là điều kỳ diệu đằng sau Node.js. Nói một cách ngắn gọn, Event Loop đúng nghĩa là một vòng lặp vô hạn và nhưng lại chỉ dùng 1 thread duy nhất.

Libuv là một thư viện C thực hiện pattern này và cũng là một phần trong các mô-đun cốt lõi của Node.js.

Event loop có sáu giai đoạn, việc thực hiện tất cả các giai đoạn được gọi là tick.

 

  • Timers: giai đoạn này thực thi các lệnh callbacks được lên lịch trình bởi setTimeout () và setInterval ().
  • Pending callbacks: thực thi hầu hết các lệnh Callbacks ngoại trừ lệnh Callbacks gần, các lệnh callbacks được lên lịch trình bởi timers và setIm Instant ().
  • Idle, prepare: chỉ được sử dụng trong nội bộ.
  • poll: truy xuất các sự kiện I / O mới; nút sẽ chặn ở đây khi thích hợp.
  • check: callbacks setIm Instant () được gọi tại đây.
  • Close callbacks: chẳng hạn như socket.on (‘close’).

 

Hãy chú ý 📢📢📢 !!!

Khi Event Loop cần thực hiện một thao tác I / O, nó sử dụng thread từ pool (thông qua thư viện libuv) và khi công việc hoàn thành, lệnh callback lại được xếp hàng đợi xử lý, chính thức chuyển sang phase Pending callbacks.

Vấn đề với các tác vụ chuyên sâu của CPU

Node.js gần như hoàn hảo, bạn có thể tạo nên bất cứ thứ gì bạn muốn. Hãy tạo nên một API để tính toán các số nguyên tố.

Cho một số N, API phải tính toán và trả về N số nguyên tố đầu tiên trong một list (hoặc mảng).

primes.js

index.js

prime.js được sử dụng để triển khai số nguyên tố, isPrime kiểm tra nếu như cho một số N thì số đó là số nguyên tố và nthPrime nhận số nguyên tố thứ n.

 

index.js tạo một máy chủ và sử dụng thư viện trong mọi lệnh gọi đến /primes. Số N được chuyển qua chuỗi truy vấn.

Để có 20 số nguyên tố đầu tiên, ta cần thực hiện yêu cầu tới http://localhost:8080/primes?n=20.

 

Giả sử có 3 khách hàng đang cố gắng truy cập vào non-blocking API:

  • Người đầu tiên yêu cầu mỗi giây 5 số nguyên tố đầu tiên.
  • Người thứ hai yêu cầu mỗi giây 1.000 số nguyên tố đầu tiên.
  • Người thứ ba yêu cầu một lần 10.000.000.000 số nguyên tố đầu tiên, nhưng…

Khi máy khách thứ ba gửi yêu cầu mà luồng chính bị chặn, đó là bởi vì thư viện số nguyên tố rất tốn CPU. Luồng chính đang bận thực thi mã chuyên sâu và sẽ không thể làm bất kỳ điều gì khác.

Nhưng còn libuv thì sao? Nếu bạn nhớ thư viện này đã giúp Node.js thực hiện các thao tác I/O với các luồng hệ điều hành để tránh chặn luồng chính và đó là giải pháp cho vấn đề. Nhưng để sử dụng libuv, thư viện phải được viết bằng ngôn ngữ C ++.

Rất may, Node.js v10.5 đã mang đến Worker Threads.

 

Worker Threads

Worker Threads rất hữu ích để thực hiện các hoạt động JavaScript sử dụng CPU; không sử dụng chúng cho I / O, vì các cơ chế tích hợp của Node.js để thực hiện các hoạt động không đồng bộ đã xử lý nó hiệu quả hơn so với Worker Threads.

 

Sửa code

primes-workerthreads.js

index-workerthreads.js

index-workerthreads.js trong mỗi lần call sẽ tạo một phiên bản mới của Worker (từ mô-đun gốc worker_threads) để tải và thực thi tệp primes-workerthreads.js trong một Worker Threads. Khi danh sách các số nguyên tố được tính toán, sự kiện thông báo được kích hoạt, gửi kết quả đến luồng chính và vì công việc đã hoàn thành nên sự kiện thoát cũng được kích hoạt, để luồng chính gửi dữ liệu đến máy khách.

primes-workerthreads.js khác biệt một chút. Nó nhập dữ liệu workerData (các tham số được truyền từ luồng chính) và parentPort, đây là cách chúng tôi gửi tin nhắn đến luồng chính.

Bây giờ chúng ta hãy làm lại ví dụ 3 khách hàng để xem điều gì sẽ xảy ra:

Giờ thì luồng chính đã không còn bị chặn nữa. Nó hoạt động hiệu quả như mong đợi tuy nhiên đây chưa phải là phương án tốt nhất. Tạo một luồng mới không rẻ, hãy chắc chắn là mình tạo pool cho threads trước.

 

Nguồn: @dev.to


Đăng trong Kiến thức IT, Tin tức Công nghệ, Uncategorized chia sẻ

Tin tức khác

Top 8 blog IT hay nhất dành cho bạn khi bước vào nghề lập trình

“Đi một ngày đàng, học một sàng khôn”. Đôi khi để học tốt không có nghĩa là bạn cứ luôn phải cắm mặt vào sách vở ...

Xem thêm

Tìm tổ tiên chung thấp nhất trong Cây nhị phân (phần 1)

Mức độ khó: Trung bình Cho một cây nhị phân (không phải cây tìm kiếm nhị phân) và hai giá trị được gọi là n1 và ...

Xem thêm

Xu hướng Công nghệ 2022: Điều gì sẽ là một “cú nổ lớn”?

Công nghệ không ngừng thay đổi, việc các công nghệ mới xuất hiện từng ngày khiến cho việc dự đoán những Xu hướng Công nghệ 2020 ...

Xem thêm

Mùa lá thu đã điểm – ngắm lá đỏ ở Nhật 2021 nơi nào đẹp nhất?

Giống như tháng 4 với màu hồng xinh xắn của hoa anh đào – sakura, từ tháng mười cho đến tháng 12 cũng là thời điểm ...

Xem thêm