Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/socketio/socket.io-cluster-adapter
The Socket.IO official cluster adapter, allowing to broadcast events between several Socket.IO servers.
https://github.com/socketio/socket.io-cluster-adapter
cluster socket-io websocket
Last synced: 4 days ago
JSON representation
The Socket.IO official cluster adapter, allowing to broadcast events between several Socket.IO servers.
- Host: GitHub
- URL: https://github.com/socketio/socket.io-cluster-adapter
- Owner: socketio
- License: mit
- Created: 2021-06-21T09:15:04.000Z (over 3 years ago)
- Default Branch: main
- Last Pushed: 2023-07-09T08:05:24.000Z (over 1 year ago)
- Last Synced: 2025-01-29T13:03:51.239Z (10 days ago)
- Topics: cluster, socket-io, websocket
- Language: TypeScript
- Homepage: https://socket.io
- Size: 140 KB
- Stars: 18
- Watchers: 3
- Forks: 11
- Open Issues: 7
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE
Awesome Lists containing this project
README
# Socket.IO cluster adapter
The `@socket.io/cluster-adapter` package allows broadcasting packets between multiple Socket.IO servers.
![Adapter diagram](./assets/adapter.png)
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)