Ana içeriğe geç

Küme adaptörü

Nasıl çalışır

Küme adaptörü, Node.js kümesi içinde Socket.IO kullanmayı sağlar.

Birden fazla istemciye gönderilen her paket (örneğin io.to("room1").emit() veya socket.broadcast.emit()) IPC kanalı aracılığıyla diğer işçilere de gönderilir.

bilgi

Bu adaptörün kaynak koduna buradan ulaşabilirsiniz.

Desteklenen özellikler

Özelliksocket.io versiyonuDestek
Socket yönetimi4.0.0✅ EVET (sürüm 0.1.0 itibarıyla)
Sunucular arası iletişim4.1.0✅ EVET (sürüm 0.1.0 itibarıyla)
Onaylı yayın yapma4.5.0✅ EVET (sürüm 0.2.0 itibarıyla)
Bağlantı durumu kurtarma4.6.0❌ HAYIR

Kurulum

npm install @socket.io/cluster-adapter

Kullanım

Node.js kümesi ile

const cluster = require("cluster");
const http = require("http");
const { Server } = require("socket.io");
const numCPUs = require("os").cpus().length;
const { setupMaster, setupWorker } = require("@socket.io/sticky");
const { createAdapter, setupPrimary } = require("@socket.io/cluster-adapter");

if (cluster.isMaster) {
console.log(`Ana ${process.pid} çalışıyor`);

const httpServer = http.createServer();

// yapışkan oturumları ayarla
setupMaster(httpServer, {
loadBalancingMethod: "least-connection",
});

// işçiler arasındaki bağlantıları ayarla
setupPrimary();

// tampon içeren paketler için gereklidir (sadece düz metin nesneleri gönderiyorsanız göz ardı edebilirsiniz)
// Node.js < 16.0.0
cluster.setupMaster({
serialization: "advanced",
});
// Node.js > 16.0.0
// cluster.setupPrimary({
// serialization: "advanced",
// });

httpServer.listen(3000);

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

cluster.on("exit", (worker) => {
console.log(`İşçi ${worker.process.pid} öldü`);
cluster.fork();
});
} else {
console.log(`İşçi ${process.pid} başlatıldı`);

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

// küme adaptörünü kullan
io.adapter(createAdapter());

// ana süreçle bağlantıyı ayarla
setupWorker(io);

io.on("connection", (socket) => {
/* ... */
});
}

PM2 ile

ipucu

İlgili belgeleri inceleyin.

recluster ile

cluster.js

const cluster = require("cluster");
const http = require("http");
const { setupMaster } = require("@socket.io/sticky");
const { setupPrimary } = require("@socket.io/cluster-adapter");
const recluster = require("recluster");
const path = require("path");

const httpServer = http.createServer();

// yapışkan oturumları ayarla
setupMaster(httpServer, {
loadBalancingMethod: "least-connection",
});

// işçiler arasındaki bağlantıları ayarla
setupPrimary();

// tampon içeren paketler için gereklidir (sadece düz metin nesneleri gönderiyorsanız göz ardı edebilirsiniz)
// Node.js < 16.0.0
cluster.setupMaster({
serialization: "advanced",
});
// Node.js > 16.0.0
// cluster.setupPrimary({
// serialization: "advanced",
// });

httpServer.listen(3000);

const balancer = recluster(path.join(__dirname, "worker.js"));

balancer.run();

worker.js

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

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

// küme adaptörünü kullan
io.adapter(createAdapter());

// ana süreçle bağlantıyı ayarla
setupWorker(io);

io.on("connection", (socket) => {
/* ... */
});

Seçenekler

İsimAçıklamaVarsayılan değer
requestsTimeoutfetchSockets() veya onaylı serverSideEmit() gibi sunucular arası istekler için zaman aşımı5000

En son sürümler

SürümSürüm tarihiSürümler notlarıFark
0.2.2Mart 2022link0.2.1...0.2.2
0.2.1Ekim 2022link0.2.0...0.2.1
0.2.0Nisan 2022link0.1.0...0.2.0
0.1.0Haziran 2021link

Tam değişiklik günlüğü