跳至主要內容
版本:4.x

與 PM2 搭配使用

PM2 是 Node.js 應用程式的生產流程管理員,內建負載平衡器。它讓您可以讓應用程式永遠保持運作,在不中斷服務的情況下重新載入應用程式,並簡化常見的系統管理員任務。

您可以在這裡找到其文件:https://pm2.dev.org.tw/docs/usage/pm2-doc-single-page/

要使用 PM2 擴充 Socket.IO 伺服器,有三個解決方案

  • 停用用戶端上的 HTTP 長輪詢
const socket = io({
transports: ["websocket"]
});

不過,在這種情況下,如果無法建立 WebSocket 連線,將不會有 HTTP 長輪詢備援。

  • 為每個工作者使用不同的埠,並在它們前面使用 nginx 等負載平衡器

  • 使用 @socket.io/pm2

安裝

npm install -g @socket.io/pm2

如果已安裝 pm2,您必須先將其移除

npm remove -g pm2

@socket.io/pm2 可用作 pm2 的直接替換,並支援 pm2 實用程式類別的所有指令。

唯一的差異來自於 此提交

用法

worker.js

const { createServer } = require("http");
const { Server } = require("socket.io");
const { createAdapter } = require("@socket.io/cluster-adapter");
const { setupWorker } = require("@socket.io/sticky");

const httpServer = createServer();
const io = new Server(httpServer);

io.adapter(createAdapter());

setupWorker(io);

io.on("connection", (socket) => {
console.log(`connect ${socket.id}`);
});

ecosystem.config.js

module.exports = {
apps : [{
script : "worker.js",
instances : "max",
exec_mode : "cluster"
}]
}

然後執行 pm2 start ecosystem.config.js (或 pm2 start worker.js -i 0)。這樣就完成了!您現在可以在 8080 埠上存取 Socket.IO 集群。

運作方式

擴充至多個節點 時,有兩件事要做

  • 啟用黏著式工作階段,以便 Socket.IO 工作階段的 HTTP 要求路由到同一個工作階段
  • 使用自訂的轉接器,以便將封包廣播給所有用戶端,即使他們已連線到另一個工作階段

為了達成此目的,@socket.io/pm2 包含兩個額外的套件

pm2 唯一的差異來自於 此提交

  • God 程序現在會建立自己的 HTTP 伺服器,並將 HTTP 要求路由到正確的工作階段
  • God 程序也會在工作階段之間中繼封包,以便 io.emit() 正確地傳送給所有用戶端

請注意,如果您有多個主機,每個主機都執行 PM2 集群,您將必須使用另一個轉接器,例如 Redis 轉接器

此分支的原始程式碼可在此處找到 here。我們將盡量緊密追蹤 pm2 套件的版本。