Redis Streams アダプター
仕組み
このアダプターは、Socket.IOサーバー間でパケットを転送するために、Redis ストリームを使用します。
既存のRedisアダプター(Redis Pub/Subメカニズムを使用)との主な違いは、このアダプターがRedisサーバーへの一時的な接続断を適切に処理し、パケットを失うことなくストリームを再開することです。
注記
- すべての名前空間で単一のストリームが使用されます
- maxLenオプションでストリームのサイズを制限できます
- Redis PUB/SUBメカニズムに基づくアダプターとは異なり、このアダプターはRedisサーバーへの一時的な接続断を適切に処理し、ストリームを再開します
- 接続状態の復旧が有効になっている場合、セッションはクラシックなキー/値ペアとしてRedisに保存されます。
ソースコード: https://github.com/socketio/socket.io-redis-streams-adapter
サポートされる機能
| 機能 | socket.ioバージョン | サポート | 
|---|---|---|
| ソケット管理 | 4.0.0 | ✅ YES (バージョン 0.1.0以降) | 
| サーバー間通信 | 4.1.0 | ✅ YES (バージョン 0.1.0以降) | 
| 確認応答付きブロードキャスト | 4.5.0 | ✅ YES (バージョン 0.1.0以降) | 
| 接続状態の復旧 | 4.6.0 | ✅ YES (バージョン 0.1.0以降) | 
インストール
npm install @socket.io/redis-streams-adapter redis
使い方
redis パッケージを使用する場合
import { createClient } from "redis";
import { Server } from "socket.io";
import { createAdapter } from "@socket.io/redis-streams-adapter";
const redisClient = createClient({ url: "redis://:6379" });
await redisClient.connect();
const io = new Server({
  adapter: createAdapter(redisClient)
});
io.listen(3000);
redis パッケージと Redis クラスターを使用する場合
import { createCluster } from "redis";
import { Server } from "socket.io";
import { createAdapter } from "@socket.io/redis-streams-adapter";
const redisClient = createCluster({
  rootNodes: [
    {
      url: "redis://:7000",
    },
    {
      url: "redis://:7001",
    },
    {
      url: "redis://:7002",
    },
  ],
});
await redisClient.connect();
const io = new Server({
  adapter: createAdapter(redisClient)
});
io.listen(3000);
ioredis パッケージを使用する場合
import { Redis } from "ioredis";
import { Server } from "socket.io";
import { createAdapter } from "@socket.io/redis-streams-adapter";
const redisClient = new Redis();
const io = new Server({
  adapter: createAdapter(redisClient)
});
io.listen(3000);
ioredis パッケージと Redis クラスターを使用する場合
import { Cluster } from "ioredis";
import { Server } from "socket.io";
import { createAdapter } from "@socket.io/redis-streams-adapter";
const redisClient = new Cluster([
  {
    host: "localhost",
    port: 7000,
  },
  {
    host: "localhost",
    port: 7001,
  },
  {
    host: "localhost",
    port: 7002,
  },
]);
const io = new Server({
  adapter: createAdapter(redisClient)
});
io.listen(3000);
オプション
| 名前 | 説明 | デフォルト値 | 
|---|---|---|
| streamName | Redisストリームの名前。 | socket.io | 
| maxLen | ストリームの最大サイズ。ほぼ正確なトリミング (~) が使用されます。 | 10_000 | 
| readCount | XREAD呼び出しごとにフェッチする要素の数。 | 100 | 
| sessionKeyPrefix | 接続状態の復旧機能が有効になっている場合に、Socket.IOセッションを保存するために使用されるキーのプレフィックス。 | sio:session | 
| heartbeatInterval | 2つのハートビート間のミリ秒数。 | 5_000 | 
| heartbeatTimeout | ノードがダウンしたとみなすまでのハートビートなしのミリ秒数。 | 10_000 | 
よくある質問
Redis Streams アダプターを使用する場合でも、スティッキーセッションを有効にする必要はありますか?
はい。そうしないと、HTTP 400レスポンスが発生します(Socket.IOセッションを認識していないサーバーにアクセスしています)。
詳細については、こちらをご覧ください。
Redisサーバーがダウンした場合どうなりますか?
クラシックなRedisアダプターとは異なり、このアダプターはRedisサーバーへの一時的な接続断を適切に処理し、パケットを失うことなくストリームを再開します。
最新リリース
| バージョン | リリース日 | リリースノート | 差分 | 
|---|---|---|---|
| 0.2.1 | 2024年3月 | リンク | 0.2.0...0.2.1 | 
| 0.2.0 | 2024年2月 | リンク | 0.1.0...0.2.0 | 
| 0.1.0 | 2023年4月 | リンク |