Bài 1: Node.js - Giới Thiệu - NodeJS cơ bản cho người mới bắt đầu

Đăng bởi: Admin | Lượt xem: 3063 | Chuyên mục: NodeJS


1. Node.js là gì ?

  • Nodejs là một nền tảng (Platform) phát triển độc lập được xây dựng ở trên Javascript Runtime của Chrome mà chúng ta có thể xây dựng được các ứng dụng mạng một cách nhanh chóng và dễ dàng mở rộng.
  • Nodejs được xây dựng và phát triển từ năm 2009, bảo trợ bởi công ty Joyent, trụ sở tại California, Hoa Kỳ. Dù sao thì chúng ta cũng nên biết qua một chút chút lịch sử của thứ mà chúng ta đang học một chút chứ nhỉ? =))
  • Phần Core bên dưới của Nodejs được viết hầu hết bằng C++ nên cho tốc độ xử lý và hiệu năng khá cao.
  • Nodejs tạo ra được các ứng dụng có tốc độ xử lý nhanh, realtime thời gian thực.
  • Nodejs áp dụng cho các sản phẩm có lượng truy cập lớn, cần mở rộng nhanh, cần đổi mới công nghệ, hoặc tạo ra các dự án Startup nhanh nhất có thể.

Node.js is a platform built on Chrome's JavaScript runtime for easily building fast and scalable network applications. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient, perfect for data-intensive real-time applications that run across distributed devices.

Node.js = Runtime Environment + JavaScript Library
Trong một môi trường server điển hình LAMP (Linux-Apache-MySQL-PHP), bạn có một web server là Apache hoặc NGINX nằm dưới, cùng với PHP chạy trên nó. Mỗi một kết nối tới server sẽ sinh ra một thread mới, và điều này khiến ứng dụng nhanh chóng trở nên chậm chạp hoặc quá tải - cách duy nhất để hỗ trợ nhiều người dùng hơn là bằng cách bổ sung thêm nhiều máy chủ. Đơn giản là nó không có khả năng mở rộng tốt. Nhưng với Node.js thì điều này không phải là vấn đề. Không có một máy chủ Apache lắng nghe các kết nối tới và trả về mã trạng thái HTTP - bạn sẽ phải tự quản lý kiến trúc lõi của máy chủ đó. May mắn thay, có một số module giúp thực hiện điều này được dễ dàng hơn, nhưng công việc này vẫn gây cho bạn một chút khó khăn khi mới bắt đầu. Tuy nhiên, kết quả thu được là một ứng dụng web có tốc độ thực thi cao.

2. Ai có thể sử dụng Node.js

 Nếu bạn có sử dụng github, bạn có thể dễ dàng tìm kiếm được danh sách các dự án, ứng dụng và các company sử dụng Node.js.Bao gồm eBay, General Electric, GoDaddy, Microsoft, PayPal, Uber, Wikipins, Yahoo!, và Yammer
Rõ ràng, không phải cứ hot và mới là Nodejs làm gì cũng tốt, ví dụ như một ứng dụng cần tính ổn định cao, logic phức tạp thì các ngôn ngữ PHP hay Ruby… vẫn là sự lựa chọn tốt hơn. Còn dưới đây là những ứng dụng có thể và nên viết bằng Nodejs:
  • Websocket server: Các máy chủ web socket như là Online Chat, Game Server…
  • Fast File Upload Client: là các chương trình upload file tốc độ cao.
  • Ad Server: Các máy chủ quảng cáo.
  • Cloud Services: Các dịch vụ đám mây.
  • RESTful API: đây là những ứng dụng mà được sử dụng cho các ứng dụng khác thông qua API.
  • Any Real-time Data Application: bất kỳ một ứng dụng nào có yêu cầu về tốc độ thời gian thực. Micro Services: Ý tưởng của micro services là chia nhỏ một ứng dụng lớn thành các dịch vụ nhỏ và kết nối chúng lại với nhau. Nodejs có thể làm tốt điều này.

3. Nội dung :

 Hãy em biểu đồ dưới đây có một vài điều quan trọng về Node.js mà ta sẽ bàn luận chi tiết trong các bài kế tiếp 
Ta sẽ tìm hiểu về JavaScrpit - ngôn ngữ được sử dụng trong Node.js
JavaScript là một ngôn ngữ dựa trên sự kiện, vì vậy bất cứ thứ gì xảy ra trên server đều tạo ra một sự kiện non-blocking. Mỗi kết nối mới sinh ra một sự kiện; dữ liệu nhận được từ một upload form sinh ra một sự kiện data-received; việc truy vấn dữ liệu từ database cũng sinh ra một sự kiện. Trong thực tế, điều này có nghĩa là một trang web Node.js sẽ chẳng bao giờ bị khóa (lock up) và có thể hỗ trợ cho hàng chục nghìn user truy cập cùng lúc. Node.js đóng vai trò của server - Apache - và thông dịch mã ứng dụng chạy trên nó. Giống như Apache, có rất nhiều module (thư viện) có thể được cài đặt để bổ sung thêm các đặc trưng và chức năng - như lưu trữ dữ liệu, hỗ trợ file Zip, đăng nhập bằng Facebook, hoặc các cổng thanh toán. Dĩ nhiên, nó không có nhiều thư viện như PHP, nhưng Node.js vẫn đang ở trong giai đoạn ban đầu và có một cộng đồng rất mạnh mẽ ở đằng sau nó. 
Một khái niệm cốt lõi của Node.js đó là các function bất đồng bộ (asynchronous functions) - vì vậy về cơ bản thì mọi thứ chạy trên nền tảng này. Với hầu hết các ngôn ngữ kịch bản máy chủ, chương trình phải đợi mỗi function thực thi xong trước khi có thể tiếp tục chạy tiếp. Với Node.js, bạn xác định các function sẽ chạy để hoàn thành một tác vụ nào đó, trong khi phần còn lại của ứng dụng vẫn chạy đồng thời. Nó là một chủ đề phức tạp mà tôi sẽ không đi vào quá sâu trong bài viết này, nhưng đó là một trong những đặc trưng tiêu biểu của Node.js, vì vậy việc nắm vững nó là điều hết sức quan trọng. Tuy nhiên tôi sẽ đưa ra một ví dụ Hello World để mang lại cho bạn một cái nhìn thoáng qua một vài những khái niệm này.
var http = require("http");   
http.createServer(function (request, response) {   
response.writeHead(200, {   'Content-Type': 'text/plain'   });   
response.write('Hello World!');   
response.end();  }).listen(8080);  
console.log("Server running!");
Hãy thử phân tích đoạn code trên. Đầu tiên, chúng ta including module http vào trong project. Sau đó chúng ta tạo ra một server và truyền vào một function anonymous như một tham số - function này sẽ được gọi khi mỗi kết nối mới sinh ra. Nó có hai đối số - request, bao gồm các tham số yêu cầu từ người dùng; và response, cái chúng ta sử dụng để gửi kết quả trả về. Tiếp đến, chúng ta sử dụng đối tượng response đó để write một header tới người dùng với mã HTTP response là 200("ok") và content type, viết ra một message "Hello World!", và kết thúc response đó. 
Cuối cùng, chúng ta nói server lắng nghe các request đến trên cổng 8080, và xuất ra một message trên cửa sổ console (command line) để báo cho chúng ta biết rằng nó đang hoạt động. Nếu bạn muốn thực sự làm thử, thì hãy lưu đoạn code trên thành file test.js, tải bộ cài đặt Node.js về, và từ cửa sổ command line chạy dòng lệnh sau -
node test.js
Sau đó mở trình duyệt lên và truy cập vào địa chỉ localhost:8080 để xem ứng dụng đầu tay của bạn! Lúc này bạn sẽ có một chút ý niệm về cách làm thế nào mà toàn bộ quá trình bất đồng bộ (asynchronous) hoạt động, đi cùng với các mô hình hướng sự kiện. Nếu bạn là một người mới tiếp xúc với JavaScript, thì khái niệm truyền các function như là một đối số của function khác có thể có một chút lạ lẫm.

4. Những kết luận sai lầm về Nodejs

  • Thứ nhất, Nodejs là một nền tảng (platform), không phải Web Framework, cũng không phải ngôn ngữ lập trình. Có một kỷ niệm đáng nhớ của mình khi đi phỏng vấn, được hỏi Nodejs là gì? Và mình đã trả lời một cách rất tự tin rằng “Nodejs là một Framework của javascript.” Và thế là thôi khỏi bàn luôn, may mà hồi đó mình mới tìm hiểu nên các anh phỏng vấn cũng thông cảm cho =))
  • Thứ hai, Nodejs không hỗ trợ đa luồng, nó là một máy chủ đơn luồng.
  • Và một điều nữa, Nodejs không dành cho người mới tinh mà chưa biết gì về lập trình, vì như đã nói ở trên, Nodejs không phải là ngôn ngữ lập trình, để học được Nodejs thì bạn cần phải biết về Javascript, kỹ thuật lập trình, một số giao thức…v..v

5. Ưu nhược điểm của Nodejs:

a. Ưu điểm :
  1. Đặc điểm nổi bật của Node.js là nó nhận và xử lý nhiều kết nối chỉ với một single-thread. Đ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.
    Ngoài ra, 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
  2. JSON APIs
    Với cơ chế 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.
  3. Ứng dụng trên 1 trang( Single page Application)
    Nếu bạn định viết 1 ứng dụng thể hiện trên 1 trang (Gmail?) NodeJS rất phù hợp để làm. 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 bạn định viết không muốn nó tải lại trang, gồm rất nhiều request từ người dùng cần sự hoạt động nhanh để thể hiện sự chuyên nghiệp thì NodeJS sẽ là sự lựa chọn của bạn.
  4. Shelling tools unix
    NodeJS sẽ tận dụng tối đa Unix để hoạt động. Tức là NodeJS có thể xử lý hàng nghìn Process và trả ra 1 luồng khiến cho hiệu xuất hoạt động đạt mức tối đa nhất và tuyệt vời nhất.
  5. Streamming Data (Luồng dữ liệu)
    Các web thông thường gửi HTTP request và nhận phản hồi lại (Luồng dữ liệu). Giả xử sẽ cần xử lý 1 luồng giữ liệu cực lớn, NodeJS 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.
  6. Ứng dụng Web thời gian thực
    Với sự ra đời của các ứng dụng di động & HTML 5 nên Node.js rất hiệu quả khi xây dựng những ứng dụng thời gian thực (real-time applications) như ứng dụng chat, các dịch vụ mạng xã hội như Facebook, Twitter,…
b. Nhược điểm :
  • Xây dựng các ứng dụng hao tốn tài nguyên:
    Bạn đừng mơ mộng đến Node.js khi bạn đang muốn viết một chương trình convert video. Node.js hay bị rơi vào trường hợp thắt cổ chai khi làm việc với những file dung lượng lớn.
  • Một ứng dụng chỉ toàn CRUD:
    Node.js không nhanh hơn PHP khi bạn làm các tác vụ mang nặng tính I/O như vậy. Ngoài ra, với sự ổn định lâu dài của các webserver script khác, các tác vụ CRUD của nó đã được tối ưu hóa. Còn Node.js? Nó sẽ lòi ra những API cực cực kỳ ngớ ngẩn.
  • Khi bạn cần sự ổn định trong ứng dụng của bạn:
    Chỉ với 4 năm phát triển của mình (2009-2013), version của Node.js đã là 0.10.15 (hiện tại tới thời điểm này là v0.10.35). Mọi API đều có thể thay đổi – một cách không tương thích ngược – hãy thật cẩn thận với những API mà bạn đang dùng, và luôn đặt câu hỏi: “Khi nó thay đổi, nó sẽ ảnh hưởng gì đến dự án của tôi?”
  • Và quan trọng nhất:
    Bạn chưa hiểu hết về Node.js
    Node.js cực kỳ nguy hiểm trong trường hợp này, 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? Và mệt mỏi hơn nữa: Khi cộng đồng Node.js chưa đủ lớn mạnh, và sẽ ít có sự support từ cộng đồng. Khi mà phần lớn cộng đồng cũng không khá hơn bạn là bao.

6. Nên sử dụng Nodejs trong những trường hợp :

  • Node.js thực sự tỏa sáng trong việc xây dựng RESTful API (json). Gần như không có ngôn ngữ nào xử lý JSON dễ dàng hơn Javascript, chưa kể các API server thường không phải thực hiện những xử lý nặng nề nhưng lượng concurrent request thì rất cao. Mà Node.js thì xử lý non-blocking. Chẳng còn gì thích hợp hơn Node.js trong trường hợp này!
  • Những ứng dụng đòi hỏi các giao thức kết nối khác chứ không phải chỉ có http. Với việc hỗ trợ giao thức tcp, từ nó bạn có thể xây dựng bất kỳ một giao thức custom nào đó một cách dễ dàng.
  • Những ứng dụng thời gian thực: Khỏi phải nói vì Node.js dường như sinh ra để làm việc này!
  • Những website stateful. Node.js xử lý mọi request trên cùng một process giúp cho việc xây dựng các bộ nhớ đệm chưa bao giờ đơn giản đến thế: Hãy lưu nó vào một biến global, và thế là mọi request đều có thể truy cập đến bộ nhớ đệm đó. Caching sẽ không còn quá đau đầu như trước đây, và bạn có thể lưu cũng như chia sẻ trạng thái của một client với các client khác ngay trong ngôn ngữ, chứ bạn không cần thông qua các bộ nhớ ngoài!
  • Quan trọng nhất: Bạn yêu thích và muốn sử dụng nó.
Bài tiếp theo: Nodejs - Khởi tạo server >>
vncoder logo

Theo dõi VnCoder trên Facebook, để cập nhật những bài viết, tin tức và khoá học mới nhất!