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

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 đề

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ờ.

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