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

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

Threads
  • Ơ buồn cười thật. Ai cũng biết GIF là định dạng ảnh động thường được dùng thay cho video clip để hiển thị các nội dung ngắn trên nền tảng web. GIF tiện hơn các nội dung dạng video là vì nó được hiển thị như một bức ảnh và được hỗ trợ rộng rãi. Cơ mà GIF có dung lượng nặng quá.

    Nói thật nhiều lúc mình có vài cái hành động muốn hiển thị lên web cho mọi người xem, cơ mà định dạng GIF nó nặng với cả cũng không biết cách tối ưu cho nhẹ xuống. Hôm nay lên mạng tìm hiểu xem định dạng nào có khả năng thay thế GIF trong tương lai thì mọi người biết đó là gì không? Là WEBP (webp)!!! Đúng vậy, là định dạng ảnh mà mình đang dùng trên blog lâu nay luôn á, mà giờ mới biết là nó hiển thị được cả ảnh động nữa, hơi quê 😆

    Kết hợp với ffmpeg nữa là chuyển được tất tần tật video clip thành webp được ngay. Để vài nửa ngồi chế lại cái cli một tí là dùng ngon luôn mọi người ạ 🤪

    » Xem thêm
  • Cảm giác như Github Copilot đang cố gắng mở rộng thị trường cho anh em developer á. Mới trước họ ra mắt Github Open Copilot Chat thì mới đây lại thêm cái Using GitHub Copilot in the command line dùng để giải thích hoặc gợi ý lệnh trong terminal.

    Đây, cách dùng rất đơn giản thôi, ví dụ muốn nó giải thích câu lệnh sudo apt-get để làm gì, thì:

    $ gh copilot explain "sudo apt-get"

    Hoặc nhờ nó gợi ý lệnh mong muốn, sử dụng tiếng Việt được luôn nhé (kể cả tiếng Việt không dấu vẫn hiểu 😳)

    $ gh copilot suggest "xoá commit chưa push"

    Mình đã kiểm tra và thấy lệnh ra rất đúng, xịn thật 🤓

    » Xem thêm
  • Github có chương trình học và ôn thi để lấy chứng chỉ "ghim" vào hồ sơ cá nhân. Các chứng chỉ này xoay quanh kỹ năng sử dụng và làm việc thành thạo với git cũng như Github. Nếu bạn muốn học thêm kỹ năng mới đồng thời thu thập thêm badge cho mình thì còn chần chừ gì nữa 👇

    Showcase your expertise with GitHub Certifications

    » Xem thêm

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.

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.

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.

Theo bạn Node.js có thực sự "nhanh"? Hãy bày tỏ quan điểm của mình phía dưới phần bình luận nhé.

hoặc
* Bản tin tổng hợp được gửi mỗi 1-2 tuần, huỷ bất cứ lúc nào.
Author

Xin chào, tôi tên là Hoài - một anh Dev kể chuyện bằng cách viết ✍️ và làm sản phẩm 🚀. Với nhiều năm kinh nghiệm lập trình, tôi đã đóng góp một phần công sức cho nhiều sản phẩm mang lại giá trị cho người dùng tại nơi đang làm việc, cũng như cho chính bản thân. Sở thích của tôi là đọc, viết, nghiên cứu... Tôi tạo ra trang Blog này với sứ mệnh mang đến những bài viết chất lượng cho độc giả của 2coffee.dev.Hãy theo dõi tôi qua các kênh LinkedIn, Facebook, Instagram, Telegram.

Bạn thấy bài viết này có ích?
Không

Bình luận (3)

Nội dung bình luận...
Avatar
Tuan Nguyen1 năm trước
Tại sao lại sử dụng nodejs: - Typescript - một ngôn ngữ tuyệt vời, càng code càng mê - Khả năng xử lý json của javascript cực kỳ bá đạo ( phải nói là bá đạo nhất trong các ngôn ngữ ) - Non-Blocking language:  - Thế giới của library - Tuy nhiên ( rất nhiều library rác ) - IDE support tận răng ( với vscode )
Trả lời
Avatar
Trần Ngọc Hải1 năm trước
V8 có thể nhanh, nhưng cơ chế quản lý bộ nhớ của nó không thực sự hiệu quả. Bằng chứng là chrome đang ngốm quá nhiều bộ nhớ. Khi bộ nhớ bị chiếm đến mức độ nào đó thì hiệu năng sẽ giảm
Trả lời
Avatar
Trần Huy Hoàng1 năm trước
Theo mình nghĩ nodejs không có gì nổi bật ngoài việc được js hậu thuẫn, còn đâu quá nặng và chậm chạp
Trả lời
Avatar
Xuân Hoài Tống1 năm trước
Node có mức tiêu thụ bộ nhớ nhiều thật nhưng tốc độ phát triển khi dùng Node là khá nhanh