Redis Streams adapter

How it works

The adapter will use a Redis stream to forward packets between the Socket.IO servers.

The main difference with the existing Redis adapter (which use the Redis Pub/Sub mechanism) is that this adapter will properly handle any temporary disconnection to the Redis server and resume the stream without losing any packets.

Notes:

  • a single stream is used for all namespaces
  • the maxLen option allows to limit the size of the stream
  • unlike the adapter based on Redis PUB/SUB mechanism, this adapter will properly handle any temporary disconnection to the Redis server and resume the stream
  • if connection state recovery is enabled, the sessions will be stored in Redis as a classic key/value pair

Source code: https://github.com/socketio/socket.io-redis-streams-adapter

Installation

  1. npm install @socket.io/redis-streams-adapter redis

Usage

  1. import { createClient } from "redis";
  2. import { Server } from "socket.io";
  3. import { createAdapter } from "@socket.io/redis-streams-adapter";
  4. const redisClient = createClient({ host: "localhost", port: 6379 });
  5. await redisClient.connect();
  6. const io = new Server({
  7. adapter: createAdapter(redisClient)
  8. });
  9. io.listen(3000);

Options

NameDescriptionDefault value
streamNameThe name of the Redis stream.socket.io
maxLenThe maximum size of the stream. Almost exact trimming (~) is used.10_000
readCountThe number of elements to fetch per XREAD call.100
heartbeatIntervalThe number of ms between two heartbeats.5_000
heartbeatTimeoutThe number of ms without heartbeat before we consider a node down.10_000

Common questions

  • Do I still need to enable sticky sessions when using the Redis Streams adapter?

Yes. Failing to do so will result in HTTP 400 responses (you are reaching a server that is not aware of the Socket.IO session).

More information can be found here.

  • What happens when the Redis server is down?

Unlike the classic Redis adapter, this adapter will properly handle any temporary disconnection to the Redis server and resume the stream without losing any packets.

Latest releases