Học lập trình web Nodejs trực tuyến
Liệu có phải Node.js sẽ thống trị trong tương lai?

Lịch sử Node.js tóm tắt

Node.js được Ryan Dahl giới thiệu 2009 cho phép lập trình JavaScript phía server. Trước đây JavaScript chỉ được coi là một ngôn ngữ đơn giản tạo hiệu ứng hoạt hình, tương tác phía trình duyệt. Cho đến khi Google Chrome sử dụng V8 engine, một bộ dịch, thực thi mã JavaScript nhanh nhất thế giới tính đến nay. V8 được viết bằng C/C++, mã nguồn mở, cho phép bên thứ 3 toàn quyền sử dụng, triển khai trên hệ điều hành khác nhau: Windows, Linux, Unix, MacOSX. Node.js được xây dựng trên V8 và thư viện LibUV cho phép lệnh thực thi hiện tại không ngăn các lệnh kế tiếp chạy luôn: cơ chế Non-Blocking I/O.

Khóa học Node.js xây dựng web site tốc độ cao sẽ khai giảng trong tháng 4/2015. Anh em học viên sẽ được benchmark tốc độ, tải để so sánh Node.js với PHP, Phalcon, WordPress. 

Cơ chế Non Blocking I/O giúp máy chủ tạo ít process (hoặc thread) hơn, ít phải luân chuyển giữa các thread để xử lý các tác vụ. Máy chủ web Nginx cũng là một ví dụ tốt Non Blocking I/O chạy tốc độ vượt trội, tốn ít bộ nhớ so với máy chủ Apache sử dụng thread switching và thread pool để hứng, xử lý các yêu cầu.

Khi tiến hành nhiều phép đo đạc tốc độ trên môi trường máy ảo giống hệt nhau về cấu hình, chúng tôi nhận thấy một thực tế không thể chối cãi, web site viết trên Node.js + Express luôn chạy nhanh hơn 1.5 - 2.5 lần web site PHP + Phalcon cùng cấu trúc, cùng hệ cơ sở dữ liệu, cùng cấu hình máy ảo. Trong nhóm các framework PHP, Phalcon luôn là đứng đầu bảng về tốc độ. Tốc độ xử lý của Phalcon trong vài trường hợp còn nhanh hơn cả HHVM. Trước đó tôi đã từng viết bài 'Tại sao chúng tôi chọn Phalcon'

Có một số ý kiến cho rằng: hiện nay chi phí thuê máy chủ ngày càng rẻ. Chỉ với 20$/tháng, đã có thể thuê một máy chủ ảo hóa 2 core 3.4 GHz, 2 GRAM DDR3, 40 G ổ cứng SSD, rẻ hơn so với năm 2012 khoảng 4 lần. Vậy nếu PHP là một ngôn ngữ phổ biến dễ học, có rất nhiều framework tuyệt vời như WordPress, Joomla, Drupal, Magento, có sẵn các theme giao diện tuyệt đẹp chỉ mất khoảng 40 - 120 USD, người dùng có mọi thứ từ một bộ CMS ổn định đến giao diện đồ họa cấu hình là chạy. Tuy nhiên trang web load chậm không phải lúc nào cũng thiếu RAM hay CPU Core. Nếu xử lý không đúng chỗ thì việc bổ xung RAM, hay CPU Core không cải thiện được triệt để.

Vào tháng 1/2015, có một sự kiện khá chấn động là đội các lập trình viên giỏi viết core của Node.js đã từ bỏ cộng đồng Node.js do Joyent bảo trợ để tạo ra iojs.org.Trong bài tôi vẫn sử dụng tên gọi node.js nhưng thực ra chúng tôi đã chuyển qua dùng iojs.org vì những lợi điểm của nó.

Thời gian tải trang (page load time) cốt tử cho sự thành bại của doanh nghiệp kinh doanh trên Internet

Thời gian tải trang (page load time) càng nhanh, trải nghiệm người dùng càng tốt, người dùng sẽ xem nhiều trang hơn, xác suất quyết định mua hàng dễ dàng hơn và ngược lại:

  • Hầu hết người duyệt web bỏ cuộc hoặc chuyển qua web site khác nếu phải chờ hơn 6-10 giây
  • Page load time từ 4 giây đã có 25% lượng người duyệt web bỏ đi
  • 1 giây chậm đi khi hiển thị trang, tỷ lệ chuyển đổi thành công từ xem sang đặt hàng (coversion rate) giảm 7%

Tham khảo thêm bài phân tích ở đây SEO 101: How Important is Site Speed in 2014? có thể tóm tắt thêm

  • 51% người mua hàng ở Mỹ phàn nàn web site quá chậm khiến họ không thể đặt hàng.
  • Năm 2010, một trang cần 6 giây để tải thì tỷ lệ chuyển đổi thành công giảm 40%, còn năm 2014, tỷ lệ này giảm sâu hơn còn 50%.
  • 47% người duyệt web muốn trang hiện ra trong vòng dưới 2 giây
  • Khi người dùng sử dụng di động, hành vi chuyển qua lại giữa các ứng dụng, web site càng gấp gáp và ngắn. Người dùng mất tập trung hơn, trang web chậm, giao diện kém thân thiện khiến người dùng nhanh chóng bỏ qua và không bao giờ quay lại lần 2.

PHP ngôn ngữ thống trị thế giới web

  • PHP được Ramus Lerdorf sáng tạo ra năm 1995, cách đây 20 năm. Phiên bản phổ biến hiện nay là 5.6. Bản 6.x gần như sẽ bị bỏ qua mặc dù đã được lên lộ trình và phát triển cách đây vài năm. Chắc chắn PHP 7 sẽ ra mắt tháng 10  2015.
  • Thế mạnh của PHP đó là cộng đồng đông đảo, mã nguồn mở cực kỳ phong phú. Số lượng việc làm cho lập trình viên PHP lớn.
  • PHP dễ học và dễ viết: dev có thể chèn mã PHP cùng với mã HTML. Tư duy lập trình tuần tự, mã HTML của trang web có thể coi là một chuỗi được cộng lại rồi trả về trình duyệt
  • Web site PHP chạy tốt trong môi trường shared hosting. Một web server có thể  chứa nhiều web site con, có tên miền riêng biệt để giảm chi phí.

Điểm yếu của PHP có thể khiến PHP thoái trào hoặc ít nhất cho Node.js cơ hội vượt lên

  • PHP không hỗ trợ non blocking sẵn mà phải sử dụng một số thư viện như React đã rất cũ. Tư duy lập trình tuần tự blocking rất dễ với người mới học, dễ debug, nhưng rất tệ khi xử lý các tác vụ tốn thời gian, buộc các tác vụ kế tiếp phải đợi
  • PHP không hỗ trợ sẵn web socket mà phải sử dụng thư viện ngoài như Rachet không đảm bảo chạy trên tất cả các hệ điều hành. Việc không hỗ trợ lập trình Web Socket, real time notification, chat, khiến cho web site PHP buộc phải sử dụng công nghệ ngoài để hỗ trợ, và thường là Node.js, Socket.io hoặc mua dịch vụ ngoài như Zopim Chat
  • Callback được giới thiệu trong PHP 5.4 . Nhưng hầu hết lập trình PHP vẫn viết web site theo phương pháp cổ điển, tuần tự từ trên xuống dưới.
  • Rất nhiều lập trình phàn nàn về tốc độ thực thi của PHP. FaceBook sáng tạo ra HHVM để biên dịch mã PHP ra bytecode tương tự như Java - Java Virtual Machine. Phalcon viết thư viện framework bằng C biên dịch ra extension. Những cố gắng này rõ ràng được đền đáp trong một số trường hợp, nhưng nó không giải quyết hết gốc rễ của lập trình blocking. Trong công ty, có một nhân viên rất giỏi, xử lý công việc rất nhanh, ai cũng phải hỏi ý kiến anh ta, việc nào cũng đến tay anh ta, một ngày kia, nhân viên giỏi này bị ốm, hoặc có quá nhiều việc dồn dập đến, mọi nhân viên khác đều phải chờ đợi.

Tốc độ PHP web site vs Node.js web site 

Hiện giờ chưa có nhiều benchmark nghiêm túc, công bằng để so sánh PHP vs JavaScript - Node.js. Vì trải nghiệm người dùng về tốc độ hiển thị trang web là quan trọng nhất, việc so sánh khập khiễng gây tranh cãi mất thời gian. Techmaster đã tổ chức một cuộc thi nội bộ trong 5 ngày giữa 2 đại diện technology stack: {PHP, PHP-FPM, Phalcon, Nginx, Postgresql, CentOS} vs {Node.js, Express, Nginx, Postgresql, CentOS}. Chúng tôi cố gắng sử dụng các công nghệ hỗ trợ giống hết nhau, trên máy chủ giống hệt về cấu hình, tạo ra một lượng dữ liệu đủ lớn 50,000 bản ghi, một web site đủ độ phức tạp gồm khác với những các benchmark trước đây khá cẩu thả chỉ trả về một chuỗi Hello World đơn giản rồi dùng Apache Benchmark. Web site 2 đội cùng viết là gồm 100 category, mỗi category có 500 mặt hàng, có phân trang, có ảnh riêng cho từng mặt hàng.... Với Node.js site, chúng tôi dùng Swig template khá giống với cú pháp template của Phalcon. Kết quả benchark được kiểm thử, rồi tinh chỉnh, rồi chạy lại, rồi tối ưu. Vì đội thắng cuộc sẽ có tiền thưởng, còn đội thua sẽ phải chạy một vòng công viên thống nhất. Kết quả cuộc đua tốc độ khá rõ ràng. Để bạn đọc có chút tò mò, tôi xin viết chi tiết ở bài tới. 

Tối ưu tốc độ WordPress không đơn giản

Trang web cũ của Techmaster sử dụng WordPress 4.1 chạy trên Nginx, PHP-FPM và Percona. Chúng tôi hiểu rõ tốc độ hiển thị chậm sẽ làm người dùng ra đi và Google sẽ đánh tụt hạng tìm kiếm. Do đó dev WordPress trong đội đã "thuốc" site WordPress đủ thứ: Total Cache để giảm việc sinh động lại trang, dùng VPS SSD loại 2 Core, 2 GRAM, bật gzip, minify CSS-JavaScript. Chúng tôi dùng Google Page Speed, để tối ưu từng điểm một. Nhưng trải nghiệm thực tế, trang web hiển thị vẫn chậm, page load time dao động từ 7 giây đến 14 giây. Tôi ngờ rằng WordPress site có quá nhiều plugin và cấu trúc bảng của WordPress cho tất cả các bản ghi vào bảng wp_post khiến việc xử lý trang ngày càng trở nên chậm chạp. Việc sửa code WordPress trực tiếp để tối ưu tốc độ là rất không nên vì khi WordPress ra phiên bản mới, mọi thứ lại phải làm lại từ đầu...:(

Chuyển đổi trang chủ Techmaster.vn từ WordPress sang Node.js

Sau cuộc thi tốc độ, Techmaster lập tức thành lập đội gồm 3 lập trình viên, ngay lập tức bắt tay vào việc xây dựng lại web site sử dụng Node.js, Express, Socket.io. Web site https://techmaster.vn gồm 563 bài viết, 3908 mục sách ebook, 859 việc làm, gần 100 lượt đăng ký học mỗi tháng được cập nhật dữ liệu liên tục hàng ngày. Traffic khoảng 23,000 views một tháng. Chúng tôi hoàn toàn không sử dụng các tip trick back link để tăng traffic. Mọi thứ để tự nhiên như nó vốn có. Cách 'câu view' duy nhất là viết những bài chia sẻ công nghệ tử tế, có ích cho cộng đồng lập trình viên và sinh viên công nghệ thông tin.

Kết quả của việc chuyển từ WordPress sang Node.js

  • Tốc độ load trang trung bình hiện nay là 0.5 - 0.8 giây. Bộ nhớ tiêu thụ cho Node.js giảm hẳn.
  • Các cron job chạy hoàn hảo.
  • Chi phí chuyển đổi khá tốn kém: 3 lập trình viên x 2 tháng. Sau này sẽ giảm vì framework hoàn thiện và có đầy đủ các chức năng cho Blog, CMS hoạt động.
  • Nhiều plugins rất cool trong WordPress chưa có ở web site mới như SEO.
  • Trang web còn một số lỗi, chưa thực sự thân thiện với người đã quen dùng WordPress.

Chúng tôi sẽ làm gì tiếp theo?

  • Chúng tôi đang cải tiến framework để hỗ trợ động các module, theme hệt như WordPress. Tôi coi theme cũng là một kiểu module đặc biệt.
  • Bổ xung chức năng chat hỗ trợ trực tuyến mà không phải mua dịch vụ hãng khác.
  • Mở mã nguồn framework này xuất phát từ thực tế, công ty Techmaster khá nhỏ, một lập trình viên phải làm nhiều dự án. Việc bảo trì một mã nguồn đóng là một ý tưởng tệ. Dự kiến tháng 5/2015, chúng tôi có thể chia sẻ đầy đủ mã nguồn, ứng dụng mẫu và văn bản hướng dẫn lập trình.
  • Mở một khóa học Node.js từ căn bản JavaScript đến nâng cao để có thêm vài anh em tham gia phát triển framework này hoặc cung cấp nhân lực cho các công ty startup vốn rất thích những công nghệ mới, cách tân.