The Socket.IO cluster adapter, allowing to broadcast events between several Socket.IO servers
npm install @socket.io/cluster-adapterThe @socket.io/cluster-adapter package allows broadcasting packets between multiple Socket.IO servers.
It can be used in conjunction with @socket.io/sticky to broadcast packets between the workers of the same Node.js cluster.
Supported features:
- broadcasting
- utility methods
- socketsJoin
- socketsLeave
- disconnectSockets
- fetchSockets
- serverSideEmit
Related packages:
- Postgres adapter: https://github.com/socketio/socket.io-postgres-adapter/
- Redis adapter: https://github.com/socketio/socket.io-redis-adapter/
- MongoDB adapter: https://github.com/socketio/socket.io-mongo-adapter/
Table of contents
- Installation
- Usage
- License
```
npm install @socket.io/cluster-adapter
`js
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(Master ${process.pid} is running);
const httpServer = http.createServer();
// setup sticky sessions
setupMaster(httpServer, {
loadBalancingMethod: "least-connection",
});
// setup connections between the workers
setupPrimary();
// needed for packets containing buffers (you can ignore it if you only send plaintext objects)
// 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(Worker ${worker.process.pid} died);Worker ${process.pid} started
cluster.fork();
});
} else {
console.log();
const httpServer = http.createServer();
const io = new Server(httpServer);
// use the cluster adapter
io.adapter(createAdapter());
// setup connection with the primary process
setupWorker(io);
io.on("connection", (socket) => {
/ ... /
});
}
``