Bạn có suy nghĩ như thế nào khi tôi nói rằng Node.js rất nhanh?

1608

Bài viết được sự cho phép của tác giả Tống Xuân Hoài

Vấn đề

Hãy thử hỏi một lập trình viên Node.js rằng điều gì bạn thích ở nền tảng bạn chọn, thì khả năng cao sẽ nhận được một câu trả lời mà trong đó có ý rằng “Node.js nhanh”. Và nếu hỏi tiếp tại sao nó nhanh thì có người sẽ nói do ngôn ngữ Javascript nhanh, do cơ chế bất đồng bộ, single thread, hay là do V8 Engine

Tất cả lý do trên có khả năng đúng trong một khía cạnh nào đó. Các cơ chế của Node.js dù thế nào đi nữa mục đích cuối cùng vẫn là tăng sức mạnh xử lý cho nó. Nhưng đó chỉ là trên lý thuyết của Node.js, thực tế không phải chỉ có Node.js mới triển khai những thứ như trên mà nhiều ngôn ngữ hay nền tảng khác đều đã triển khai, thậm chí còn triển khai một cách tốt hơn nữa.

Vậy thực hư nói Node.js “nhanh” là “nhanh” như thế nào? Bài viết này tôi xin trình bày quan điểm của tôi khi nói về vấn về “Node.js nhanh”.

Nhưng trước tiên, hãy dành thời gian xem qua các cơ chế mà mọi người hay nhắc đến để từ đó kết luận rằng nó nhanh nhé.

Single thread

Node.js sử dụng mô hình Single thread thông qua Event Loop để xử lý bất đồng bộ. Nhờ đó mà Node.js có thể xử lý nhiều yêu cầu cùng một lúc một cách dễ dàng.

Cho dễ hình dung, với những ngôn ngữ không theo mô hình Single thread như PHP. Mỗi một kết nối đến nó sẽ tạo ra một thread để xử lý. Rõ ràng máy chủ phải bỏ ra một phần chi phí (cost) tài nguyên như CPU, bộ nhớ cho mỗi thread được tạo. Hãy nghĩ xem điều gì xảy ra khi có nhiều yêu cầu được gửi đến?

Mô hình này mang lại một vài thế mạnh cho Node.js như giảm số luồng (thead) ít nhất có thể để giảm mức tiêu thụ tài nguyên của hệ thống nhưng vẫn đáp ứng được yêu cầu xử lý một lượng lớn yêu cầu đồng thời.

  Worker threads là gì? Bạn đã biết khi nào thì sử dụng Worker threads trong node.js chưa?

  Nguyên lý SOLID trong Node.js với TypeScript

Bất đồng bộ (I/O async)

Một ứng dụng web hiếm khi nào mà không cần dùng đến cơ sở dữ liệu. Chúng ta đều biết hành vi kết nối, truy vấn cơ sở dữ liệu là mất nhiều thời gian hơn so với những câu lệnh thông thường. Giả sử một endpoint trong API cần gọi một lệnh truy vấn và truy vấn tiêu tốn 2s để đưa ra kết quả, với mô hình Single thread của Node thì chẳng phải yêu cầu thứ hai phải đợi tối thiểu 2s rồi mới được xử lý tiếp hay sao? Tương tự cho yêu cầu thứ 3, thứ 4… sẽ gây nên một cấp số nhân về độ trễ???

Đừng lo lắng vì thế mạnh của Node.js là xử lý I/O không đồng bộ. Một số lượng nhất định các yêu cầu sẽ gần như được xử lý cùng lúc. Chỉ có điều Node.js sẽ lần lượt phản hồi kết quả cho từng yêu cầu, và việc này thường diễn ra rất nhanh chóng. Đối với PHP vì các thread là độc lập nên chúng có thể thoải mái trả về kết quả cùng một lúc.

V8 Engine

Nhắc đến Node, không thể bỏ qua V8 Engine. Công cụ này là trình thông dịch diễn dãi mã JS thành mã máy và chạy nó. Tốc độ của V8 là cực kì ấn tượng trong tất cả các Javascript Engine.

Vậy rốt cục nói Node.js nhanh là như thế nào?

Bạn có thể nghe thấy ai đó khuyên rằng Node.js thực sự phù hợp trong một số trường hợp như triển khai hệ thống API, làm ứng dụng realtime như chat, hay là những công việc thiên về I/O. Chứ rất ít bài viết khen Node.js nhanh ở khía cạnh tốc độ xử lý của nó.

Hiệu năng luôn luôn là vấn đề của mọi ngôn ngữ hay nền tảng trong các bài toán xử lý lượng yêu cầu đồng thời lớn. Bởi vì mỗi ngôn ngữ được tạo ra để tập trung giải quyết một vấn đề nào đó. Chính vì thế đánh giá rằng Node.js nhanh là không thực sự chính xác, mà chúng ta nên đánh giá rằng Node.js thực sự phù hợp trong trường hợp nào? Tại sao?

Nói như vậy không có nghĩa là Node.js không “nhanh”. Nhưng cái nhanh của Node.js tôi nghĩ rằng nó nằm ở tốc độ triển khai và phát hành.

Node cung cấp môi trường chạy mã JS mà JS thì lại cực kì phổ biến trên bản đồ ngôn ngữ lập trình của thế giới. Vì thế cộng đồng sử dụng Node rất lớn và bạn có thể nhanh chóng tìm được một người cộng sự phát triển dự án cùng mình. Cũng chính vì sự phát triển đó mà vô số thư viện được triển khai cho Node thông qua npm. Bạn sẽ không cần phải vất vả phát minh lại bánh xe, cộng đồng sẽ giúp bạn làm điều đó.

Tóm lại, theo tôi thứ quyết định đến một ngôn ngữ hay nền tảng mạnh mẽ chính là thái độ của nhà phát triển cùng với độ phủ sóng của ngôn ngữ hay nền tảng đó trong cộng đồng.

Xem thêm việc làm Node.js developer hấp dẫn nhất tại TopDev

So sánh hiệu năng của Node.js với ngôn ngữ hay nền tảng khác

Nếu chưa tin rằng Node.js không “nhanh”, Techempower đã dành thời gian của họ để tiến hành đo sức mạnh của nhiều ngôn ngữ hay nền tảng với nhau. Để đảm bảo khách quan, họ sẽ chạy nhiều bài test và mỗi bài test thực hiện trên nhiều ngôn ngữ hay nền tảng, trong cùng một môi trường hoàn toàn giống nhau. Cẩn thận hơn, hàng năm họ còn cập nhật phiên bản mới nhất của ngôn ngữ hay nền tảng và tiến hành đo lại.

Trong kết quả đo mới nhất là vào tháng 7/2022 với bài test máy chủ phản hồi plaintext (một dạng kiểu “hello world”). Node.js với một Framework nổi tiếng là fastify đứng ở vị trí 156 với lượng yêu cầu xử lý được là 575,967 req/s thấp hơn rất nhiều so với các Framework khác dựa trên ngôn ngữ như C#, Java hay là Golang. Cụ thể con số có thể đạt đến hơn 7 triệu req/s đối với aspcore của C#.

Benchmark

Một bài test về tốc độ truy vấn trong cơ sở dữ liệu thì fastify-mysql có thể xử lý được 9,383 req/s vẫn thấp hơn rất nhiều so với con số hơn 20k của C#.

Ngoài ra còn nhiều bài test khác về hiệu năng. Bạn đọc có thể nghiên cứu thêm cùng với cách thức đo điểm chuẩn của Techempower tại Project Information Framework Tests Overview.

Tổng kết

Tóm lại qua bài viết này tôi chỉ muốn làm rõ khái niệm “nhanh” của Node.js là như thế nào. Đồng thời nhấn mạnh rằng mỗi ngôn ngữ hay nền tảng được sinh ra đều có lý do của nó, việc so sánh nhanh hay chậm chưa chắc đã phản ánh đúng hết thế mạnh của ngôn ngữ hay nền tảng. Thay vào đó, chúng ta nên nắm bắt được điểm mạnh, yếu của chúng để áp dụng giải quyết bài vào từng bài toán sao cho phù hợp.

Bài viết gốc được đăng tải tại 2coffee.dev

Xem thêm:

Xem thêm Việc làm IT hấp dẫn trên TopDev