[NodeJS] Lựa chọn mới cho nền tảng server side

Trước khi đề cập đến các vấn đề mang tính kỹ thuật, hãy dành một chút thời gian để nói về bản thân bạn và mối quan hệ của bạn với JavaScript. Nếu bạn giống tôi, bắt đầu từ “lập trình” HTML, bằng việc viết các tài liệu HTML, bạn được biết đến với một thứ rất hay có tên JavaScript, nhưng từ trước tới nay mới bạn chỉ sử dụng nó ở mức độ hết sức cơ bản là tăng sự tương tác với người dùng cho các trang web của bạn.

Bạn thấy chúng qua các bài giới thiệu về jQuery, prototype… hay tương tự như thế, khiến JavaScript trở nên cao cấp và phức tạp hơn với bạn, không hẳn chỉ là window.open(). Nhưng xét cho cùng thì tất cả vẫn chỉ dừng lại ở phía front-end (thực thi trên trình duyệt), tuy rằng bạn biết thêm “gia vị” cho trang web của bạn bằng việc sử dụng jQuery, nhưng lạc quan mà nói, bạn vẫn chỉ là một người dùng JavaScript chứ không phải một lập trình viên JavaScript.

Dù bạn có là một lập trình viên chuyên phát triển các ứng dụng front-end (phía người dùng) thì bạn vẫn cần phải biết và hiểu rõ mọi thứ hoạt động như thế nào ở phần back-end (phía server). Khả năng có thể tạo ra các chuỗi liên kết từ phía ứng dụng front-end, thông qua API rồi truyền đến database ở phía server là một kỹ năng quan trọng. Trong lĩnh vực này, các lập trình viên có rất nhiều lựa chọn để chọn cho mình một công nghệ phù hợp như sử dụng Java, .NET, Python hay PHP. Tuy nhiên, nếu bạn đã thông thạo ngôn ngữ JavaScript trước đó và nay muốn bắt tay vào tìm hiểu về back-end, Node.js là một sự lựa chọn hoàn hảo dành cho bạn.

Node.js là cái quái gì vậy?

Bạn nghĩ sao nếu JavaScript có thể chạy bên phía máy chủ?

Trước giờ, JavaScript đã luôn được sử dụng ở phía client, tức là bên phía của khách truy cập trình duyệt trang web. Các mã JavaScript này được chạy bởi trình duyệt của client (Firefox, Chrome, IE, v.v …) và thực hiện các hành động trên trang web.

Mô hình cổ điển: PHP trên server, JavaScript dưới client

Tuy nhiên, Node.js cung cấp một môi trường phía máy chủ , cho phép chúng ta sử dụng ngôn ngữ JavaScript để tạo các trang web. Về cơ bản, nó thay thế các ngôn ngữ máy chủ như PHP, Java EE…

Mô hình javascript trên máy chủ

Vậy Node.js là gì? Nó có điểm gì mạnh so với các ngôn ngữ lập trình khác?

Như trên trang chủ của Node.js có viết rõ:

Node.js® is a JavaScript runtime built on Chrome’s V8 JavaScript engine. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient. Node.js’ package ecosystem, npm, is the largest ecosystem of open source libraries in the world.

Chrome’s V8 Javascript engine là một mã nguồn mở giúp biên dịch Javascript trực tiếp đến mã máy gốc trước khi thực thi nó, thay cho các kỹ thuật truyền thống như phiên dịch các bytecode hoặc biên dịch toàn bộ chương trình tới mã máy và thực hiện nó từ một hệ thống tập tin.

Như vậy, có thể nói Node.js không phải là Framework hay CMS gì cả, cũng không phải là một ngôn ngữ lập trình mới bởi nó là sự kết hợp giữa 2 ngôn ngữ lập trình C++ và JavaScript (do được xây dựng dựa trên nền tảng  V8 này), mà nó chỉ là một môi trường để thực thi code JavaScript trên server. Do đó, nó cho phép lập trình viên dễ dàng – nhanh chóng xây dựng các ứng dụng có tính mở rộng và đáp ứng cao sử dụng JavaScript trên server. Và vì được biên dịch trực tiếp đến mã máy gốc nên về mặt tốc độ xử lý thì rất nhanh.

Node.js sử dụng cơ chế hướng sự kiện, mô hình giao tiếp  non-blocking I/O cho nên làm cho ứng dụng nhẹ mà hiệu quả, vô cùng hoàn hảo cho các ứng dụng thời gian thực. Một đặc điểm nữa là do sử dụng JavaScript nên Node.js có thể chạy trên nhiều nền tảng hệ điều hành khác nhau (Windows, Linux, MacOS…) và trên mọi loại thiết bị phân tán.

Rất có thể bạn đã quen thuộc với Ajax được viết tắt của các từ Asynchronous JavaScript and XML, rõ ràng từ Asynchronous đã nói lên Ajax là một kỹ thuật xử lý bất đồng bộ. Nhiều bạn lập trình viên khi viết ứng dụng Ajax mà quên mất rằng đây là một chương trình bất đồng bộ, tức là thao tác gửi Ajax và các đoạn code bên dưới sẽ được chạy song song. Node.js cũng vậy, mỗi function trong Node.js là bất đồng bộ. Vì vậy, mọi thứ bình thường kẹt trong thread thì giờ đây được thực thi dưới background. Đây là điều quan trọng nhất bạn nên nhớ về Node.js.

Ngoài ra, Node.js chứa một thư viện built-in cho phép các ứng dụng hoạt động như một Webserver mà không cần cài đặt thêm các phần mềm như Nginx, Apache hoặc IIS để hỗ trợ. Thêm nữa, Node.js còn cung cấp rất nhiều thư viện bổ sung (module) hữu ích, vì thế bạn sẽ không phải bắt đầu xây dựng các ứng dụng của bạn từ con số 0 nữa.

Các tính năng vượt trội của Node.js

Node.js có vẻ rất hấp dẫn. Nhưng khi bạn quyết định bắt tay xây dựng một dự án bằng Node.js, hãy đặt câu hỏi: “Tại sao lại là Node.js? Nó có thể làm được những gì? Tôi có nên dùng nó vào dự án của mình hay không?”. Và dưới đây là một vài gợi ý dành cho bạn.

Đầu tiên là ưu điểm về tốc độ thực thi và khả năng mở rộng. Node.js có tốc độ thực thi rất nhanh do được biên dịch trực tiếp tới mã máy gốc. Đó là một yêu cầu khá quan trọng khi bạn là một startup đang cố gắng tạo ra một sản phẩm lớn và muốn đảm bảo có thể mở rộng nhanh chóng, đáp ứng được một lượng lớn người dùng khi trang web của bạn phát triển lên.

Thứ hai là Node.js có thể xử lý hàng ngàn kết nối đồng thời chỉ với một single-thread (đơn luồng) trong khi các ngôn ngữ server truyền thống sẽ chỉ có nước sụp đổ. Điều này giúp hệ thống tốn ít RAM nhất và chạy nhanh nhất khi không phải tạo thread mới cho mỗi truy vấn giống PHP. Cùng xem mô hình dưới đây để hiểu tại sao Node.js được đánh giá cao hơn.

So sánh cách nhận và xử lý các request giữa server truyền thống và Node.js

Với khả năng xử lý nhiều request/s, đồng thời thời gian phản hồi nhanh, các ứng dụng mà bạn định viết không muốn nó phải tải lại trang mặc dù nhận rất nhiều request từ người dùng, bạn cần sự hoạt động nhanh để thể hiện sự chuyên nghiệp thì Node.js sẽ là sự lựa chọn cho bạn.

Thứ ba, với cơ chế kiến trúc hướng sự kiện (event-driven), non-blocking I/O (Input/Output) và mô hình kết hợp với Javascript là sự lựa chọn tuyệt vời cho các dịch vụ Webs làm bằng JSON. Tận dụng ưu điểm non-blocking I/O của Javascript mà Node.js tận dụng tối đa tài nguyên của server mà không tạo ra độ trễ như PHP.

Cơ chế blocking I/O

Các web thông thường gửi HTTP request và nhận dữ liệu phản hồi lại. Giả sử sẽ cần xử lý một luồng giữ liệu cực lớn, Node.js sẽ xây dựng các Proxy phân vùng các luồng dữ liệu để đảm bảo tối đa hoạt động cho các luồng dữ liệu khác.

Thêm nữa, với sự ra đời của các ứng dụng di động & HTML5, Node.js rất hiệu quả khi xây dựng những ứng dụng thời gian thực (Realtime applications) như ứng dụng chat, các dịch vụ mạng xã hội…

Một số  khó khăn khi tiếp cận

Node.js chỉ là một môi trường – nghĩa là bạn phải tự tay làm mọi thứ. Điều này có thể gây bối rối cho những người mới học, nhưng bù lại chúng ta sẽ xây dựng được ứng dụng web có tốc độ thực thi cao. Để bắt đầu được với Node.js, bạn cũng cần có những kiến thức cơ bản sau:

  • Javascript: Bắt buộc nhé, đơn giản vì code Node.js là hoàn toàn bằng Javascript
  • Shell Command: Bạn cần biết những lệnh cơ bản như: duyệt đến thư mục, tạo thư mục, copy thư mục, phân-cấp quyền… Tùy theo môi trường bạn sử dụng để develop mà lệnh của windows, linux, osx là khác nhau.
  • Biết về kiểu dữ liệu, đặc biệt là kiểu dữ liệu JSON – là kiểu dữ liệu mà Node.js sẽ sử dụng nhiều.
  • Những hiểu biết cơ bản về ứng dụng dạng server-client, ip, port.., I/O blocking – I/O non-blocking.
  • Biết về lập trình web để viết ứng dụng web, hoặc biết về service khi bạn chỉ đơn thuần là viết một service cung cấp một số chức năng nào đó.

Giống như hầu hết các công nghệ mới, việc triển khai Node.js trên host không phải là điều dễ dàng. Nếu bạn có một web hosting xài chung, bạn không thể đơn giản tải lên một ứng dụng Node.js và mong chờ nó hoạt động tốt. VPS và dedicated server là một sự lựa chọn tốt hơn – bạn có thể cài đặt Node.js trên chúng nhưng cần phải có kinh nghiệm trong quản lý server nếu không sẽ làm sập server bất cứ lúc nào.

Một chú ý nữa là, Node.js chạy trên single thread và dùng cơ chế event-loop để xử lý nhiều request cùng lúc, một số ứng dụng sử dụng nhiều CPU như encoding video, convert file, decoding, encryption… sẽ làm nghẽn lại cơ chế event-loop của Node.js. Do đó, chúng ta không nên dùng Node.js cho các ứng dụng tiêu tốn tài nguyên CPU như vậy.

Ngoài ra, Node.js vẫn đang trong giai đoạn phát triển ban đầu, điều này có nghĩa là một số đặc trưng sẽ thay đổi trong quá trình phát triển tiếp theo. Vậy nên nếu bạn cần sự ổn định trong các ứng dụng của bạn, Node.js sẽ không phải là sự lựa chọn thích hợp trong trường hợp này.

Vậy chúng ta nên sử dụng Node.js khi nào thì ổn?

 

Với những đặc điểm đã nêu trên, một số gợi ý sau có thể giúp bạn xây dựng các ứng dụng cho mình bằng Node.js như:

  • Ứng dụng web hoặc website thông thường giống như các ngôn ngữ lập trình web PHP, C#, Java Web, Python, Ruby,…
  • Websocket Server
  • Ứng dụng Upload file tốc độ cao
  • Dịch vụ đám mây Cloud Service
  • Microservices
  • Ứng dụng web thời gian thực (realtime): chat, group chat, realtime work app,…
  • Ứng dụng Desktop (vd: Electron framework,…)
  • Ứng dụng Restful API

Lời kết

Node.js và JavaScript vẫn là xứ sở thiên đường mà tại đó bạn có thể làm rất nhiều việc. Đằng nào thì bạn vẫn phải dùng JavaScript ở phía client, tại sao không dùng nó luôn ở server, mobile và nhiều nơi khác nữa?

Trên đây là một số hiểu biết của tôi về Node.js. Cá nhân tôi cũng đang trong quá trình tìm hiểu, Node.js vẫn còn là cái gì đó khá là mới mẻ với tôi. Nếu bạn cũng đang tìm hiểu về nó, hy vọng bài viết này sẽ hữu ích với bạn. Biết đâu qua bài viết này, bạn lại có thêm một lựa chọn mới cho nền tảng server side thì sao?

Hẹn gặp lại trong các bài viết tiếp theo! Sẽ đào sâu hơn về Node.js 

in Tech


STDCLASS Là Gì? Làm Thế Nào Để Có Properties Động Trong PHP?