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://localhost: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://localhost:7000",
},
{
url: "redis://localhost:7001",
},
{
url: "redis://localhost: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月 | リンク |