Get in touch
or send us a question?
CONTACT

NODEJS

Định nghĩa chính thức trên trang chủ :“Node.js là một trình chạy JavaScript được xây dựng dựa trên V8 JavaScript engine của Chrome.”

Node.js là gì ?

Node.js là platform mã nguồn mở được phát triển bởi Ryan Dahl một kỹ sư phần mềm sinh năm 1981, ở San Diego, California, USA vào năm 2009.
Node.js là một trình chạy JavaScript được xây dựng dựa trên V8 JavaScript engine của Chrome.
Node.js xử lý lệnh trên một luồng duy nhất và sử dụng mô hình event-driven, Non-blocking I/O.
Node.js sử dụng trình quản lý gói mặc định là NPM. npm là viết tắt của Node Package Manager

Kiến trúc hệ thống Node.js

Node.js Được xây dựng trên “Chrome V8” (C++), “libuv” (C) và một số thư viện Javascript.

  • Chrome V8 là một Javascript engine mã nguồn mở được viết bằng C++ và phát triển bởi The Chromium Project cho trình duyệt web Google Chrome và Chromium. Công cụ này giúp biên dịch mã JavaScript sang bytecode giúp cho việc thực thi nhanh hơn

  • libuv là một thư viện được viết bằng C và hỗ trợ đa nền tảng (Unix, Window ..), tập trung vào asynchronous I/O (Giao tiếp với hệ thống theo phương pháp bất đồng bộ)

Node.js sử dụng trình quản lý gói mặc định là NPM. npm là viết tắt của Node Package Manager

=> Node.js là một nền tảng cho phép thực thi các chương trình được viết bằng mã Javascript và giao tiếp với hệ thống theo phương pháp bất đồng bộ trên các hệ điều hành.

=> Trước đây JavaScript chỉ được biết đến là ngôn ngữ kịch bản dùng cho web nhưng giờ đây với Node.js JavaScript có thể chạy trên các hệ điều hành và có khả năng làm những thứ mà các ngôn ngữ lập trình kịch bản khác có thể làm.

Tại sao Node.js lại trở nên phổ biến

Node.js là Open source → Hoàn toàn miễn phí.

Community size

  1. Theo thông kê của stackoverflow.com Tính đến hết 2019 thì JavaScript là ngôn ngữ có 8 năm liên tiếp xếp tốp đầu về mức độ sử dụng phổ biến nhất → Việc có một cộng đồng hỗ trợ lớn sẽ giúp việc xử lý các vấn đề trong lúc xây dựng ứng dụng nhanh hơn.
  2. Theo thống kê của github.com tính đến hiện tại có tới hơn 3,5 triệu gói library và framework dựng sẵn dành cho trình quản lý gói NPM → Có nhiều library và framework dựng sẵn giúp rút ngắn thời gian phát triển và phát hành ứng dụng.
    VD về 1 số library và framework có trong package manager NPM:
  • React.js là thư viện JavaScript phổ biến nhất dùng để xây dựng giao diện người dùng web (Web UI) hay ứng dụng web trên một trang (Single-Page Applications)
  • React Native là một framework do Facebook phát triển dùng để xây dựng ứng dụng đa nền tảng như App Android, App IOS, App Window, App Mac.
  • Express là một framework dùng để xây dựng ứng dụng web back-end.
  • TensorFlow.js là một thư viện dành cho học máy trong JavaScript.
  • Node-RED là một công cụ để kết nối các thiết bị phần cứng, API và dịch vụ trực tuyến với nhau như là một phần của Internet of Things
  • Angular là một web framework JavaScript được phát triển và tài trợ bởi Google và cộng đồng để giải quyết các vấn đề gặp phải trong việc phát triển ứng dụng đơn trang. Nó nhằm mục đích để đơn giản hóa cả phát triển và thử nghiệm của các ứng dụng bằng cách cung cấp một framework với kiến trúc cho client side đó là MVC và MVVM.
  • Vue.js là một framework linh động dùng để xây dựng giao diện người dùng (Web UI).
  • Nest.js là một framework để xây dựng các ứng dụng server-side. Nó sử dụng ngôn ngữ bậc cao của JavaScrip là TypeScript (nhưng vẫn cho phép các nhà phát triển sử dụng JavaScript thuần túy) và kết hợp các tính chất của OOP (Lập trình hướng đối tượng), FP (Lập trình chức năng) và FRP (Lập trình phản ứng chức năng)

Cross-platform

libuv là một thư viện C đa nền tảng cung cấp và hỗ trợ xử lý Non-blocking I/O dựa trên các Event loop, Nó hỗ trợ các cổng sự kiện epoll, kqueue, Windows IOCP và Solaris → Các nhà phát triển làm việc với Node.js có quyền tự do phát triển các ứng dụng đa nền tảng Web Client, Back-end, Mobile App, Desktop App, Smartwatch, Robot và IOT, Machine Learning. → “Learn a language, Write Anywhere !” Học một ngôn ngữ và viết nó ở mọi nơi vì Platform Node.js giúp mã JavaScrip chạy trên các nền tảng khác nhau.

Boosts Development Speed

  • Node.js cho phép bạn các nhà phát triển đẩy nhanh quá trình phát triển ứng dụng web bằng các công cụ nhẹ và đa dạng của nó.
  • Với 11 triệu nhà phát triển trên toàn thế giới, Gói npm cung cấp nhiều giải pháp, module và library để tạo ứng dụng web bằng cách đầu tư với nỗ lực ít hơn nhưng thu được nhiều giá trị hơn.
  • Node.js, cùng với các thư viện từ npm, giúp bạn giảm lỗi và giảm kích thước ứng dụng web của mình với các mẫu có thể tái sử dụng. Sự tối ưu hóa này ảnh hưởng trực tiếp đến thời gian đưa ra thị trường.

Performance

Node.js chạy trên công cụ V8 Javascript engine giúp nó thông dịch trực tiếp Javascript sang mã máy → Điều này làm cho nó tận dụng hiệu quả tài nguyên của hệ thống cũng như tăng tốc độ xử lý.
Node.jd sử dụng cơ chế non-blocking I/O, Event Loop.

  • Asynchronous I/O: Không theo thứ tự, các hành động bắt đầu sẽ theo thứ tự nhưng kết thúc thì không. Một hành động có thể vừa bắt đầu và kết thúc trước khi hành động trước đó được hoàn thành.
  • Event-Driven là mô hình kiến trúc phần mềm thúc đẩy các xử lý, phản ứng với các sự kiện xảy ra.
  • Non-Blocking I/O: Xét một tình huống là chúng ta cần dữ liệu backend chi tiết cho user1 và user2 và sau đó hiển thị chúng trên màn hình hoặc bảng điều khiển. Để phản hồi cho lệnh này sẽ mất thời gian, nhưng cả 2 dữ liệu user có thể thực hiện độc lập và cùng lúc.

Blocking I/O

Non-Blocking I/O

  • Call Stack: là thành phần của V8 và là một vùng nhớ đặc biệt trên con chip máy tính phục vụ cho quá trình thực thi các dòng lệnh mà cụ thể là các hàm.
  • Web API: là một thực thể trong Browser, nó làm việc với các thread giúp đẩy các job ra bên ngoài và tạo ra các event kèm theo các handle.
  • Queue hay Task queue: nơi lưu trữ các callback của các event ngoại vi chờ xử lý
  • Event Loop: là một thực thể của V8 Javascript engine, nó sẽ nhặt Event đầu tiên nằm trong Queue và handler gắn với Event đó để đẩy vào Stack khi Stack trống.
    • Lưu ý: Điều này không phải lúc nào cũng đúng. Trong một số trường hợp, giống như trong trình duyệt, các API của trình duyệt cũng có xu hướng cung cấp các Event loop.

Step 1: khi các function đi vào CPU thì tất cả đều được xử lý trong vùng Call Stack mà không bị chặn bất cứ lệnh nào (non-Blocking), đối với những lệnh liên quan đến I/O sẽ giao lại cho I/O xử lý, còn call Stack sẽ vẫn tiếp tục xử lý các dòng lệnh tiếp theo.
Step 2: khi I/O có kết quả sẽ lưu trữ vào các vùng nhớ định trước task Queue
Step 3: Event Loop kiểm tra Task Queue trong trường hợp Task Queue có Event và call stack trống thì lúc này Event loop sẽ đẩy handle của event đó từ task Queen vào Call Stack để tiếp tục xử lý.
=> Đây chính là cơ chế xử lý bất đồng bộ (Asynchronous) và hướng sự kiện (Event-Driven) của V8 Javascript engine.

  • Hoạt động của Node.js

  • Event Queue: là nơi chứa các request chờ xử lý, Event Queue có mức độ ưu tiên xử lý thấp hơn so với Task Queue.
  • Thread pool ở đây là các worker pool của libuv dành riêng để xử lý files và thao tác DNS(getAddrInfo), mặc định có 4 thread trong thread pool trừ khi có custom config.

Scalability

Node.js được thiết kế để xây dựng các ứng dụng phân tán với nhiều node. Đây là lý do tại sao nó được đặt tên là Node.js.

  1. Phát triển nhiều microservice, mỗi microservice đảm nhiệm những công việc khác nhau. VD: microservice authentication, microservice Analytics, microservice search
  2. clone ứng dụng ra thành nhiều bản, chạy mỗi bản trên 1 instance và sử dụng cân bằng tải của nginx để quản lý các instance.
  3. Phân vùng dữ liệu. VD: Phân vùng người dùng theo vùng địa lý hay quốc gia mà họ sinh sống và mỗi ứng dụng sẽ chịu trách nhiệm xử lý phân vùng dữ liệu khác nhau.
  4. Các giải pháp khác trong Node.js. VD: setImmediate(callback), background process, worker-farm, Worker Thread.

Khi nào không nên sử dụng Node.js

  • Single Thread, Non-blocking I/O và event-driven → Không phù hợp với các xử lý tốn tài nguyên và nặng CPU như encoding video, convert file, decoding, encryption… nó sẽ gây ra tình trạng nghẽn cổ chai. Trong trường hợp này cần viết 1 Addon C++ tích hợp với Node.js để tăng hiệu suất tối đa !
  • Cơ chế bất đồng bộ của JavaScript làm người mới khó hiểu, khó tiếp cận. Bạn sẽ rơi vào một thế giới đầy rẫy cạm bẫy, khó khăn với phần lớn các API hoạt động theo phương thức non-blocking/async việc không hiểu rõ vấn đề sẽ làm cho việc xuất hiện những error mà thậm chí bạn không biết nó xuất phát từ đâu? → Node.js không dành cho người chưa biết gì về JavaScript.