Khi nào nên dùng NodeJs


Giới thiệu

Cộng đồng javascript gia tăng nhanh trong thời gian gần đây đã mang lại nhiều thay đổi, thậm chí thay đổi một cách căn bản cách viết các ứng dụng web. Giờ thì javascript có thể chạy cả ở client lẫn server. Trước khi bước vào tìm hiểu NodeJS một cách cặn kẽ có lẽ ta sẽ xem wikipedia nói gì :

NodeJs là một gói phần mềm được biên dịch dựa trên nhân V8 của Google, libuv và một thư viện lõi được phát triển cũng chính bằng Javascript

Điều đáng chú ý là trước đó tác giả của NodeJs - Ryan Dahl chỉ muốn tạo ra một website thời gian thực (real-time website) có tính năng push giống như Gmail. Nodejs mang lại cho các developer một bộ công cụ để làm việc với các kiến trúc non-blocking và event-driven. Tóm lại NodeJs chỉ thực sự mạnh ở các ứng dụng web real-time cần tính năng push dựa trên web-socket. Vậy tại sao người ta lại gọi đó là một cuộc cách mạng ?

Sau 20 năm hoàng kim của thời đại các HTTP Request không trạng thái (stateless) cuối cùng cũng có một ứng dụng web thời gian thực , kết nối hai chiều nghĩa là cả server và client đều có thể khởi tạo kết nối và truyền dữ liệu, trái ngược hẳn với mô hình stateless cũ khi chỉ có client mới là bên khởi tạo kết nối. Nền tảng về HTML, CSS, JS hay cả cổng 80 vẫn được giữ nguyên.

Có người sẽ thắc mắc là cơ chế này đã có từ lâu trong Flash hay Applet rồi , tuy nhiên trong thực tế hai cái trên chỉ là môi trường giả lập và sử dụng giao thức web như một phương tiện truyền dữ liệu đến client thôi. Ngoài ra chúng thường chạy độc lập và không chạy qua các cổng chuẩn mặc định, điều này cần một số quyền và động chạm vấn đề bảo mật. Chính vì thế mà hiện nay NodeJs đang ngày trở nên có giá trị trong thế giới web.

NodeJs làm việc như thế nào

Ý tưởng chính của NodeJs là sử dụng môt hình non-blocking, event-driven để tạo ra các ứng dụng web thời gian thực nhẹ tải, hiệu suất cao đồng thời có thể chạy trên rất nhiều thiết bị khác nhau. Tuy nhiên NodeJs không phải là một cái gì đó đánh đổ toàn bộ nền tảng web từ trước đến giờ mà nó chỉ là một giải pháp phù hợp với một nhu cầu nhất định. Nếu bạn dùng NodeJs cho các ứng dụng yêu cầu tính toán cao thì thực tế là bạn đã từ bỏ tất cả nhứng gì tinh túy nhất của NodeJs rồi. NodeJs chỉ thực sự mạnh ở các ứng dụng cần tốc độ, khả năng mở rộng vì điểm mạnh của nó là khả năng xử lí một lượng rất lớn các connection với throughput cao, đồng nghĩa với khả năng mở rộng (scalability) là rất lớn.

Các nền tảng web-server cũ (apache,nginx...) sẽ sinh ra một thread mới khi có request và cấp bộ nhớ cho thread đó đến khi nào hết RAM thì thôi, nghĩa là max-connection sẽ phụ thuộc khá nhiều vào RAM. NodeJs thì ngược lại, dùng một thread duy nhất cùng với các câu lệnh I/O non-blocking cho phép nó phục vụ hàng chục ngàn connection cùng một lúc.

Image Text

Giả sử mỗi request được cấp 2MB với một cục RAM 8GB ta chỉ có thể phục vụ 4000 connection một lúc . Đó là còn chưa tính bộ nhớ cho các process khác hay phục vụ cho việc chuyển đổi của đống thread đó. Tuy nhiên cũng với ngần ấy tài nguyên Nodejs có thể đảm đương một lúc cả triệu connection.

Sẽ có người đặt câu hỏi rằng việc cả triệu connection mà chỉ dùng một thread sẽ có thể gây ra nhiều bug. Đơn giản nhất là nếu request đòi hỏi tính toán nhiều thì cái thread duy nhất đó có thể bị treo dẫn đến toàn bộ một triệu request phải ngồi chờ cho cái request đầu tiên tính xong. Thứ nữa là nếu chẳng may có exception thì cái thread đó sẽ kéo theo cả triệu request chết cùng. Cách giải quyết của Nodejs là trả cái exception đó về cho nơi gọi thông qua callback thay vì throw nó như các nền tảng khác. Mà nếu có một vài exception vẫn cố tình xảy ra thì NodeJs vẫn có cơ chế để khôi phục hoạt động như là Forever module , cái này có thể sẽ được nói đến trong một bài viết khác.

Khi nào thì dùng NodeJs

1. CHAT: Vì chat là một ứng dụng real-time với nhiều người dùng điển hình nhất, chat cần tốc độ làm giảm độ trễ, băng thông lớn cho nhiều người dùng, it các thao tác tính toán đơn thuần là truyền dữ liệu.

2. API: Mặc dù Nodejs mạnh nhất khi viết các ứng dụng real-time tuy nhiên nó cũng rất khá khi viết các API thao tác với các database kiểu object như MongoDB. Dữ liệu kiểu JSON cho phép Nodejs thao tác một cách tự nhiên mà không cần convert.

3. HÀNG ĐỢI: Nếu ứng dụng của bạn phải nhận cùng lúc một lượng data rất lớn thì rất dễ làm database bị nghẽn cổ chai . Mặc dù Nodejs có thể xử lí concurrent connection rất tốt nhưng bản chất của database vẫn là blocking cho nên vẫn có thể gặp rắc rối. Giải pháp đưa ra là tống hết vào hàng đợi.

4. DATA STREAMING: Trong các nền tảng cũ thì HTTP Request được xử lí như các event độc lập nhưng thực thế nó lại là các stream dữ liệu. Điều này có thể tạo ra các ứng dụng đặc biệt như xử lí file trong khi nó còn đăng upload.

5. PROXY: Với khả năng xử lí nhiều request một lúc, Nodejs tỏ ra rất thích hợp làm proxy, đặc biệt là với các dịch vụ có thời gian response khác nhau hay thu thập dữ liệu từ nhiều nguồn khác nhau.

Bình luận (0)

Bình luận (<{ numberComments }>)

  • avatar
    <{ comment.author.username }> Reply
    <{ comment.createdAt | date:'yyyy-MM-dd HH:mm:ss' }>
    • avatar
      <{ reply.author.username }>
      <{ reply.createdAt | date:'yyyy-MM-dd HH:mm:ss' }>