Cluster trong Node.js là gì? Sử dụng Cluster để tăng khả năng chịu tải ứng dụng viết bằng Node.js

Cluster trong Node.js là gì? Sử dụng Cluster để tăng khả năng chịu tải ứng dụng viết bằng Node.js

Những mẩu tin ngắn hàng ngày dành cho bạn
  • Một phần mềm giúp chuyển đổi văn bản thành giọng nói do một lập trình viên người Việt làm ra - J2TEAM - Text to Speech (Free). Bạn có thể chuyển đổi hàng chục ngôn ngữ sang hàng chục giọng đọc tự nhiên khác nhau. Điều đặc biệt là nó miễn phí.

    Đánh giá sơ bộ thì chuyển đổi văn bản dài hoặc văn bản bằng tiếng Việt thuần thì rất tốt. Còn dính thêm các từ tiếng Anh thì nó đọc hơi buồn cười 😅

    » Xem thêm
  • Quá ghê ghớm, Codeium - vốn được biết đến như một đối thủ của Github Copilot, khi nó cho người dùng dùng miễn phí không giới hạn. Mới đây họ giới thiệu thêm Windsurf Editor - không chỉ còn là VSCode Extentions nữa mà là một trình Editor luôn - cạnh tranh trực tiếp với Cursor. Và điểm chính là nó... hoàn toàn miễn phí 🫣.

    » Xem thêm
  • Tin vui đầu này, Github Copilot đã chính thức có bản Free cho tất cả mọi người.

    Github Copilot là một trợ lý AI code cùng chúng ta, nó có thể tự động hoàn thành mã, trò chuyện hoặc sửa lỗi. Hiện đang hỗ trợ nhiều trình soạn thảo, IDE phổ biến như VSCode, JetBrains, XCode...

    Phiên bản miễn phí đang bị giới hạn 2000 Suggestions, và khoảng 50 requests đến tính năng Chat hàng tháng. Sau đó bạn có thể nâng cấp lên các phiên bản cao cấp hơn với giá từ 10$.

    Theo đánh giá của mình thì Copilot rất tốt và xứng đáng trong tầm giá, đang dùng hàng ngày 😄

    » Xem thêm

Vấn đề

Node.js chỉ có một luồng để chạy mã Javascript, nghĩa là tại một thời điểm chỉ xử lý được một lệnh JS. Nếu như ứng dụng có nhiều mã JS mất thời gian để xử lý thì khả năng "nút thắt cổ chai" sẽ xuất hiện. Hay đơn giản như ứng dụng của bạn xử lý tác vụ nhẹ nhàng nhưng với số lượng yêu cầu đồng thời là rất lớn, dẫn đến kết nối timeout liên tục do không thể xử lý hết lượng yêu cầu.

Có thể nói một phần sức mạnh ứng dụng nằm ở tốc độ của Vi xử lý (CPU). Ngày nay CPU ngày càng mạnh hơn và tích hợp nhiều lõi (core) hơn. Nếu ứng dụng Node.js của bạn chỉ chạy trên một lõi của CPU thì quả là lãng phí. Phải chi có một cách nào đó giúp cho ứng dụng tận dụng được hết số lõi của CPU thì tuyệt vời. Làm một phép tính đơn giản, giả sử hiện tại ứng dụng xử lý được 1000 req/s, bây giờ tận dụng được 8 lõi của CPU thì con số đó có thể lên đến ~8000 req/s. Hơn nữa còn tăng khả năng chịu lỗi nếu chẳng may một instance bị trục trặc thì vẫn còn 7 instance sẵn sàng xử lý.

Để tận dụng sức mạnh của vi xử lý đa lõi cũng như tăng khả năng xử lý, khả năng chịu lỗi thì Cluster là một trong những phương pháp tối ưu, chúng ta cùng tìm hiểu về Cluster trong bài viết dưới đây nhé.

Cluster là gì?

Cluster trong Node.js có thể được sử dụng để chạy nhiều phiên bản (instance) Node.js để phân phối khối lượng công việc giữa chúng. Sự khác biệt giữa Cluster và Worker Threads là Cluster cách ly các quy trình (threads) của worker, trong khi Worker Threads chạy nhiều quy trình trong một phiên Node.js duy nhất.

Về bản chất, các worker được tạo ra bởi Cluster bằng cách sử dụng child_process.fork() để chúng có thể giao tiếp với tiến trình tạo ra nó thông qua IPC.

Cluster hỗ trợ hai phương pháp phân phối công việc:

  • Cách thứ nhất (mặc định trên tất cả các nền tảng ngoại trừ Windows) là cách phân phối theo vòng, trong đó quy trình chính (Primary) lắng nghe trên một cổng, lắng nghe các kết nối mới và phân phối chúng cho các worker theo kiểu vòng tròn mà các nhà phát triển tích hợp "phương pháp phân phối thông minh" để tránh làm quá tải quy trình của worker.

  • Cách tiếp cận thứ hai là cách quy trình chính tạo ra socket để lắng nghe và gửi nó đến những worker. Sau đó các worker trực tiếp xử lý các yêu cầu đó.

Trên lý thuyết, cách tiếp cận thứ hai sẽ mang lại hiệu quả tốt nhất. Tuy nhiên trong thực tế, phân phối qua socket có xu hướng mất cân bằng do sự thay đổi của bộ lập lịch hệ điều hành. Các nhà phát triển đã quan sát và thấy rằng hơn 70% tất cả các kết nối được phân phối đến chỉ trong hai quy trình, trong tổng số tám quy trình.

Những worker được tạo ra là các quy trình riêng biệt, chúng có thể bị "kill" hoặc "re-spawned" tùy thuộc vào chương trình, mà không ảnh hưởng đến các worker khác. Miễn là có một vài worker còn hoạt động, máy chủ sẽ tiếp tục xử lý yêu cầu đến và ngược lại.

Triển khai Cluster

Để triển khai Cluster chúng ta sử dụng module node:cluster tích hợp trong Node. Thông thường số lượng worker được tạo ra sẽ bằng với số lõi CPU. Ví dụ dưới đây sử dụng Node.js 18 LTS và express.js:

const cluster = require('node:cluster');
const numCPUs = require('node:os').cpus().length;
const express = require('express');

if (cluster.isPrimary) {
  console.log(`Primary ${process.pid} is running`);

  for (let i = 0; i < numCPUs; i++) {
    cluster.fork();
  }

  cluster.on('exit', (worker, code, signal) => {
    console.log(`worker ${worker.process.pid} exited`);
  });
} else {
  const app = express();
  app.use(express).listen(port);

  console.log(`Worker ${process.pid} started`);
}

Sau đó khởi chạy với lệnh node.

$ node index.js
Primary 3596 is running
Worker 4324 started
Worker 4520 started
Worker 6056 started
Worker 5644 started

Bạn sẽ thấy số Worker được tạo ra bằng đúng số lõi CPU thông qua module node:os.

Để xem chi tiết hơn về cách triển khai, vào Node.js Cluster.

Ngoài ra chúng ta còn có thể sử dụng công cụ pm2 để triển khai ứng dụng Node.js tương tự như Cluster module.

Tổng kết

Cluster là một phương pháp nhanh và thuận tiện nhất để tăng khả năng xử lý mã Javascript ứng dụng của bạn bằng cách tận dụng đa lõi CPU. Việc triển khai Cluster khá đơn giản bằng module node:cluster được tích hợp sẵn trong Node.js. Thuật toán phân phối công việc của Cluster sẽ giúp điều phối lượng công việc đảm bảo cho các worker không bị quá tải. Nếu bạn đang sở hữu một máy chủ đa lõi và muốn tận dụng hết số lõi đó thì hãy thử triển khai Cluster ngay bây giờ.

Cao cấp
Hello

5 bài học sâu sắc

Mỗi sản phẩm đi kèm với những câu chuyện. Thành công của người khác là nguồn cảm hứng cho nhiều người theo sau. 5 bài học rút ra được đã thay đổi con người tôi mãi mãi. Còn bạn? Hãy bấm vào ngay!

Mỗi sản phẩm đi kèm với những câu chuyện. Thành công của người khác là nguồn cảm hứng cho nhiều người theo sau. 5 bài học rút ra được đã thay đổi con người tôi mãi mãi. Còn bạn? 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.
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 (0)

Nội dung bình luận...