Exec Mode Cluster Trong PM2 Khi Sử Dụng Express, Socket IO

Hiện tại khi các bạn sài PM2 để chạy các ứng dụng NodeJS của bạn, PM2 cho phép bạn tạo ra cái ứng dụng cho phép cân bằng tải bằng cách tạo ra nhiều cluster theo số lượng CPU của server, bằng lệnh

pm2 start ecosystem.config.js -i 4

Câu lệnh trên cho phép tạo ra 4 instance ứng dụng node, chạy đồng thời cùng nhau, PM2 xử lý vụ cân bằng tải giữa các instance này.

Hoặc bạn có thể cấu hình chạy exec_mode cluster trong file ecosystem.config.js

module.exports = {
  /**
   * Application configuration section
   * http://pm2.keymetrics.io/docs/usage/application-declaration/
   */
  apps: [
    // First application
    {
      name: 'API node',
      script: 'index.js',
      cwd: 'bin',
      instances:  "max",
      instance_var: "INSTANCE_ID",
      exec_mode: 'cluster'
    },
  ],
};
  • exec_mode: cluster
  • instances: “max”  hoặc 0 (có nghĩa là pm2 sẽ tự động detect số lượng core cpu tối đa để tạo ra số instance tương ứng)
    • Giá trị của instance có thể là -1 hoặc con số (số -1 có nghĩa có max core cpu – 1)
    • Một con số cụ thể (để chỉ định số instance được tạo ra, ví dụ: 2)

Một vấn đề khi bạn sài PM2 để chạy cluster thì trong ứng dụng nodeJS của bạn có sài socket sẽ không chạy được, vì hiện tại lúc đó socket cũng phải chia sẻ giữa các instance nodeJS

Để chạy được nodeJS với socket ở exec_mode cluster, bạn phải sử dụng thêm redis, và adapter socket.io-redis. Gồm 3 bước thao tác như sau:

  1. Cài redis server:
    # on mac
    brew install redis
  2. Cài đặt gói socket.io-redis trên ứng dụng nodeJS của bạn: yarn add socket.io-redis
    – Cấu hình thêm ở lúc khởi tạo socket server

    const io = socket();
    // Add the redis adapter
    io.adapter(redis({ host: 'localhost', port: 6379 }))
  3. Cấu hình thêm khi khởi tạo socket ở phía client:
     socket = io.connect(REACT_APP_IO_URL, {
            transports: [ 'websocket', 'polling' ]
        });

    Thêm cấu hình transports: [ ‘websocket’, ‘polling’ ]

Rate this post

You May Also Like

About the Author: truongluu

Leave a Reply

Your email address will not be published. Required fields are marked *