101 lines
2.7 KiB
Markdown
101 lines
2.7 KiB
Markdown
# Socket.IO cluster adapter
|
|
|
|
The `@socket.io/cluster-adapter` package allows broadcasting packets between multiple Socket.IO servers.
|
|
|
|

|
|
|
|
It can be used in conjunction with [`@socket.io/sticky`](https://github.com/socketio/socket.io-sticky) to broadcast packets between the workers of the same Node.js [cluster](https://nodejs.org/api/cluster.html).
|
|
|
|
Supported features:
|
|
|
|
- [broadcasting](https://socket.io/docs/v4/broadcasting-events/)
|
|
- [utility methods](https://socket.io/docs/v4/server-instance/#Utility-methods)
|
|
- [`socketsJoin`](https://socket.io/docs/v4/server-instance/#socketsJoin)
|
|
- [`socketsLeave`](https://socket.io/docs/v4/server-instance/#socketsLeave)
|
|
- [`disconnectSockets`](https://socket.io/docs/v4/server-instance/#disconnectSockets)
|
|
- [`fetchSockets`](https://socket.io/docs/v4/server-instance/#fetchSockets)
|
|
- [`serverSideEmit`](https://socket.io/docs/v4/server-instance/#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](#installation)
|
|
- [Usage](#usage)
|
|
- [License](#license)
|
|
|
|
## Installation
|
|
|
|
```
|
|
npm install @socket.io/cluster-adapter
|
|
```
|
|
|
|
## Usage
|
|
|
|
```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`);
|
|
cluster.fork();
|
|
});
|
|
} else {
|
|
console.log(`Worker ${process.pid} started`);
|
|
|
|
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) => {
|
|
/* ... */
|
|
});
|
|
}
|
|
```
|
|
|
|
## License
|
|
|
|
[MIT](LICENSE)
|