Công nhân nodejs

From before to this, you are learn about Node. js đều được bảo đảm là Node. js chỉ xử lý đơn luồng. Tức là tại một thời điểm, chỉ có một chủ đề được thực hiện

Nói đơn giản cho dễ hiểu. bạn có CPU 8 nhân, 16 luồng. Giờ bạn muốn duyệt 1 triệu bản ghi để tìm phần tử lớn nhất. Với nút. js, sẽ chỉ có 1 luồng của CPU đang thực hiện công việc duyệt tìm vì nút mặc định. js là một luồng. 1 thread chạy đầu, 7 thread kia ngồi cười khúc khích

Nhưng với Java, công việc được chia đều ra cho các chủ đề, nên tốc độ sẽ xử lý trong bài toán, ví dụ này sẽ nhanh hơn

Đến đây, mình tin là bạn sẽ nổi lên thắc mắc. Do not have any way to Node. js thực hiện multi stream à?

Thế mạnh của Node. js là cơ chế non-blocking I/O, giúp ứng dụng có tốc độ rất nhanh. Tuy nhiên, có những bài toán yêu cầu phải xử lý đa luồng để tận dụng sức mạng CPU đa nhân. Tất nhiên là có thể làm được nhờ sự giúp đỡ của cụm

Bài viết này chúng ta sẽ cùng nhau tìm hiểu về Cluster trong Node. js

Công nhân nodejs
Cluster trong Node. js

Nội dung chính của bài viết

  • Khi nào nên sử dụng Cluster
    • Cluster trong Node. js hoạt động như thế nào?
  • Cách sử dụng Cluster
    • Sử dụng cụm kết hợp với Express. js
    • Kết luận

Khi nào nên sử dụng Cluster

Như mình đã đề cập ở trên, thế mạnh của Node. js is none-blocking I/O, điều này giúp cho ứng dụng mặc định dù chỉ sử dụng 1 luồng để chạy nhưng tốc độ thì không hề hơi chút nào. Đơn giản vì Node. js tận dụng được khoảng thời gian rảnh rỗi của CPU

Tuy nhiên, điều này chỉ phù hợp với các ứng dụng mà mỗi nhiệm vụ chỉ thực hiện trong thời gian ngắn. Kiểu như ứng dụng trò chuyện, ứng dụng chạy Thời gian thực…

Còn với các ứng dụng nặng về tính toán như xử lý ảnh, thu thập dữ liệu… thì đơn luồng như Node. js không phù hợp

If you are also “chày sướng” select Node. js thì vẫn có cách. That is used cluster to Node. js có thể xử lý đa luồng, tận dụng CPU nhân mà vẫn nhàn nhã

Cluster trong Node. js hoạt động như thế nào?

Cluster trong Node. js được tạo một cách đơn giản, bạn sử dụng một mô-đun cùng tên. mô-đun cụm

Cơ chế hoạt động của nó cũng khá đơn giản. Cluster module cho phép Node. js tạo số luồng nhỏ hơn hoặc bằng số lõi của CPU, tự động phân chia công việc để tận dụng sức mạnh của CPU

Cách sử dụng Cluster

Lý thuyết thì cơ bản vậy thôi, chúng ta sẽ cùng nhau thực hiện tạo cluster để xử lý multi-stream trong Node. js

Đoạn mã bên dưới mình sẽ tạo một máy chủ lắng nghe cùng một cổng thông qua cụm

/*
  Đoạn code demo tạo clusters
*/
'use strict';

// Importing các Modules cần thiết
const http = require('http'),
    cluster = require('cluster'),
    os = require('os').cpus().length;

/*
Chúng ta sẽ tạo số cluster tương ứng với số nhân của CPU.
*/
if (cluster.isMaster) {

    for (let i = 0; i < os; i++) {
        cluster.fork();
        console.log(`The Worker number: ${i + 1} is alive`);
    }

    cluster.on('exit', (worker) => {
        console.log(`The Worker number: ${worker.id} has died`);
    });

} else {

    // Chúng ta sẽ tạo các cluster cùng lắng cùng một port
    http.createServer((sol, res) => {
        res.end('Hi, we are harnessing the power of clusters :)');
    }).listen(3000, () => console.log('The server is running on the port:3000'));

    console.log(`The Worker number: ${cluster.worker.id} is running`);
}

Như đoạn mã trên, cụm đầu tiên được tìm thấy sẽ là cụm chính. Sau đó thì sẽ nhân bản ra các cluster từ master cluster, đó chính là cách mà chúng ta chia sẻ port. Một người nghe cũng được thêm vào cụm để biết trạng thái dừng/thất bại của một công nhân

Sử dụng cụm kết hợp với Express. js

At the ví dụ trên, chúng ta đã biết cách tạo cụm với mô-đun http. Giờ chúng ta sẽ làm một ví dụ về cách sử dụng cluster khi kết hợp http và express. js

/*
  Creating clusters and serving an application that uses express

*/
'use strict';

// importing the modules
const cluster = require('cluster'),
      os      = require('os').cpus().length,
      server  = require('./serverHttp');

/*
 We see if it is the master cluster in case it is,
 we will clone the cluster amount at the same time as the cores
 of the processor.
*/
if(cluster.isMaster){

  const Master = require('./work');
  const master = new Master({cluster:cluster});

  for(let i = 0; i < os; i++){
    master.liftWorker();
  }

  cluster.on('exit', (worker)=>{
    console.log(worker)
    console.log(`The Worker number: ${worker.id} is dead.`);
    master.liftWorkerError();
  });

}else{

  // Creating a server with http and express.
  let app = new server();
  app.initiate();
  console.log(`cluster ${cluster.worker.id} is running.`)

}

Bạn thấy đấy, cách viết mã cũng tương tự như lúc trước. Chỉ khác là lần này chúng ta sẽ chia công việc thành nhiều mô-đun

>> Đọc thêm về cách chia module. Nút. js Module là gì?

// Class to pick cluster workers
class Master {
    constructor(config){
  
      this.config = config || {};
      this.cluster = this.config.cluster;
  
    }
  
    // Pick up a new Worker
    liftWorker(){
  
      let worker = this.cluster.fork();
      console.log(`The worker ${worker.id} is started.`);
  
    }
  
    // Raise a worker when one dies in case of errors
    liftWorkerError(){
      let worker = this;
  
      setTimeout(()=>{
        worker.liftWorker();
      }, 200);
  
    }
  }
  
  module.exports = Master;

Về cơ bản là chúng ta sẽ tạo riêng một tệp là công việc. js. Mục đích của mô-đun này là cung cấp các phương thức để tạo mới một hoặc nhiều công nhân khi một công nhân bị chết

Cuối cùng là chúng ta sẽ có mô-đun chính để tạo máy chủ và lắng nghe một cổng

'use strict';

const http = require('http'),
  express  = require('./express');

// Creating the server with http
class Servidor{
  constructor(config){
    this.config = config || {};

    this.app = new express();

    this.server = http.createServer(this.app.server);

    this.app.gets();

  }

  // Starting the server
  initiate(){
    
    this.server.listen(3000, ()=> console.log('The server is running on port 3000'));

  }
}

module.exports = Servidor;
'use strict';

const express = require('express');

class Server {
  constructor(config){
    this.config = config || {};
    this.server = express();
  }

  // Serving the routes get
  gets(){

    this.server.get('/', (sol, res, next)=>{
      
      res.send(`This route is served by the workes`);

    });

    this.server.get(`/hello`,(sol, res, next)=>{

      res.send('This route too 🙈');

    });

  }

}

module.exports = Server;

Kết luận

Nút. js là giải pháp thích hợp để xử lý các ứng dụng có lưu lượng truy cập lớn. Tuy nhiên, với các ứng dụng nặng về tính toán thì Node. js cũng có thể làm tốt

Mình biết về cluster trong Node. js cũng khá lâu rồi. Nhưng hồi đó cụm còn chưa ổn định và ngon lành như bây giờ. Time thì ngon rồi

Tất nhiên, cũng như các ngôn ngữ, giải pháp khác, việc xử lý đa luồng chưa bao giờ là dễ dàng, mã sẽ cần nhiều logic hơn. Nhưng nhìn chung, cluster sẽ giúp bạn đơn giản hóa rất nhiều công việc xử lý đa luồng trong Node. js

Mã nguồn

Cảm nhận của bạn về cụm khi sử dụng trong dự án như thế nào?

Công nhân nodejs

​Miễn phí khóa học React Native

Bạn có muốn tải xuống toàn bộ video của khóa học rất nổi tiếng về React Native này không?

TẢI XUỐNG

Công nhân nodejs

  • THẺ
  • jav
  • lap trinh nodejs
  • nodejs

Facebook

Twitter

liên kết

Pinterest

WhatsApp

Bài trước Một số dịch vụ tăng lưu lượng truy cập cho trang web với giá rẻ 2022

Bài tiếp theo RxJava-Thời đại của lập trình Reactive đã tới

Công nhân nodejs

sơn dương

Tên đầy đủ là Dương Anh Sơn. Tốt nghiệp ĐH Bách Khoa Hà Nội. Mình bắt đầu nghiệp coder khi mà ra trường đúng là xin được làm đúng chuyên ngành. Mình tin rằng chỉ có chia sẻ kiến ​​thức mới là cách học tập nhanh nhất. Các bạn góp ý bài viết của mình bằng cách comment bên dưới nhé