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?

Tin ngắn hàng ngày dành cho bạn
  • Rust sinh ra để tái định nghĩa nhiều thứ. Trong đó chắc phải kể đến JavaScript. Từ đầu năm đến giờ các công cụ làm từ Rust mà để cho JavaScript dùng đếm sương sương cũng vài ba cái rồi. Mới đây nhất là Oxc.

    Oxc là một công cụ phân tích cú pháp (parser), kiểm tra lỗi (lint), định dạng (formatter), chuyển đổi (transformer), minifier... tất cả đều được viết bằng Rust, trong một công cụ duy nhất.

    Mặc dù vẫn đang trong quá trình xây dựng nhưng thử nhìn điểm hiệu năng của nó so với swc hoặc eslint mà xem 🫣

    » Xem thêm
  • Mấy hôm nay, à mà cũng không hẳn, do sự kiện WWDC vừa rồi nên Apple lại bị dân cư mạng mang ra bàn tán rằng rốt cục thì các tính năng AI của họ đang ở đâu? Trong khi các hãng khác đang lao mình vào việc mang AI lên thiết bị, phần mềm của họ thì Apple lại đang có vẻ... không quan tâm lắm.

    Thậm chí mới đây các nhà nghiên cứu của Apple cho rằng các mô hình LLM sẽ "sụp đổ hoàn toàn về độ chính xác" khi được đưa ra các vấn đề cực kỳ phức tạp. Chỉ ra rằng suy luận chỉ là huyễn hoặc thì ngay lập tức đã có nhiều bài phản bác nghiên cứu này. Một lần nữa cho thấy rằng Apple đang suy nghĩ điều gì với AI trên thiết bị của họ?

    Mình thì nghĩ đơn giản thôi, Apple có vẻ đang gặp khó khăn với việc tạo ra AI cho riêng họ. Tức là khó khăn ngay từ đoạn thu thập dữ liệu để đào tạo rồi. Họ luôn tỏ ra tôn trọng quyền riêng tư của người dùng nên chẳng lẽ lại lên mạng đi xào nấu dữ liệu ở khắp nơi, hoặc "chôm" dữ liệu dưới máy người dùng lên? Chắc chắn, họ cũng không muốn cung cấp thêm dữ liệu người dùng cho các bên thứ 3 như OpenAI.

    Nhưng nhờ những khó khăn này biết đâu họ lại tìm ra được hướng đi mới. Ai cũng chọn phần dễ thì gian khổ để phần cho ai 😁. À mình không phải là "fan" của Apple, chỉ là thấy cái nào phù hợp thì dùng thôi 🤓

    » Xem thêm
  • Người "nhạy cảm" với markdown đó là khi thấy một thư viện tạo khung soạn thảo mới là nhảy ngay vào xem nó có gì mới. Milkdown/milkdown là một ví dụ.

    Xem thử thì thấy ổn phết mọi người ạ. Vài nữa thử tích hợp vào opennotas xem sao. Mang tiếng là ứng dụng ghi chú hỗ trợ markdown cơ mà cái thư viện tiptap nó không chịu làm thêm phần hỗ trợ markdown 😩. Dùng thư viện ngoài thì vẫn chưa ngon cho lắm.

    » 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é.

Cao cấp
Hello

Bí mật ngăn xếp của Blog

Là một lập trình viên, bạn có tò mò về bí mật công nghệ hay những khoản nợ kỹ thuật về trang blog này? Tất cả bí mật sẽ được bật mí ngay bài viết dưới đây. Còn chờ đợi gì nữa, hãy bấm vào ngay!

Là một lập trình viên, bạn có tò mò về bí mật công nghệ hay những khoản nợ kỹ thuật về trang blog này? Tất cả bí mật sẽ được bật mí ngay bài viết dưới đây. Còn chờ đợi gì nữa, hãy bấm vào ngay!

Xem tất cả

Đăng ký nhận thông báo bài viết mới

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.

Bình luận (4)

Nội dung bình luận...
Avatar
Ẩn danh4 tháng trước

blog méo gì đọc được 2, 3 dòng có cái QC :))) hài vl, chào tạm biệt và thân ái

Trả lời
Avatar
Xuân Hoài Tống4 tháng trước

Đầu xuân năm mới, chúc bạn nhiều sức khỏe. Mình gắn qc để vừa giúp quảng bá sản phẩm đến cộng đồng, vừa kiếm được một ít hoa hồng nhưng không đáng kể đâu ạ. Ai cũng có công việc riêng của mình vậy nên vài nữa mình phát hành bản trả phí rất mong bạn và nhiều người nữa quan tâm 😅

Avatar
Tuan Nguyen2 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ải2 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àng2 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ống2 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