メインコンテンツにスキップ
バージョン: 4.x

Redisアダプター

仕組み

Redisアダプターは、RedisのPub/Subメカニズムに依存しています。

複数のクライアントに送信されるすべてのパケット (例: io.to("room1").emit() または socket.broadcast.emit()) は

  • 現在のサーバーに接続されているすべての一致するクライアントに送信されます
  • Redisチャネルにパブリッシュされ、クラスターの他のSocket.IOサーバーによって受信されます
Diagram of how the Redis adapter worksDiagram of how the Redis adapter works

このアダプターのソースコードはこちらにあります。

対応機能

機能socket.io バージョン対応状況
ソケット管理4.0.0✅ 対応 (バージョン 6.1.0以降)
サーバー間通信4.1.0✅ 対応 (バージョン 7.0.0以降)
確認応答付きブロードキャスト4.5.0✅ 対応 (バージョン 7.2.0以降)
接続状態の復旧4.6.0❌ 未対応

インストール

npm install @socket.io/redis-adapter

互換性一覧

RedisアダプターバージョンSocket.IOサーバーバージョン
4.x1.x
5.x2.x
6.0.x3.x
6.1.x4.x
7.x以上4.3.1以上

使用方法

redisパッケージを使用する場合

注意

redisパッケージは、再接続後にRedisサブスクリプションの復元に問題があるようです

代わりにioredisパッケージを使用することをお勧めします。

import { createClient } from "redis";
import { Server } from "socket.io";
import { createAdapter } from "@socket.io/redis-adapter";

const pubClient = createClient({ url: "redis://localhost:6379" });
const subClient = pubClient.duplicate();

await Promise.all([
pubClient.connect(),
subClient.connect()
]);

const io = new Server({
adapter: createAdapter(pubClient, subClient)
});

io.listen(3000);

redisパッケージとRedisクラスタを使用する場合

import { createCluster } from "redis";
import { Server } from "socket.io";
import { createAdapter } from "@socket.io/redis-adapter";

const pubClient = createCluster({
rootNodes: [
{
url: "redis://localhost:7000",
},
{
url: "redis://localhost:7001",
},
{
url: "redis://localhost:7002",
},
],
});
const subClient = pubClient.duplicate();

await Promise.all([
pubClient.connect(),
subClient.connect()
]);

const io = new Server({
adapter: createAdapter(pubClient, subClient)
});

io.listen(3000);

ioredisパッケージを使用する場合

import { Redis } from "ioredis";
import { Server } from "socket.io";
import { createAdapter } from "@socket.io/redis-adapter";

const pubClient = new Redis();
const subClient = pubClient.duplicate();

const io = new Server({
adapter: createAdapter(pubClient, subClient)
});

io.listen(3000);

ioredisパッケージとRedisクラスタを使用する場合

import { Cluster } from "ioredis";
import { Server } from "socket.io";
import { createAdapter } from "@socket.io/redis-adapter";

const pubClient = new Cluster([
{
host: "localhost",
port: 7000,
},
{
host: "localhost",
port: 7001,
},
{
host: "localhost",
port: 7002,
},
]);
const subClient = pubClient.duplicate();

const io = new Server({
adapter: createAdapter(pubClient, subClient)
});

io.listen(3000);

RedisシャーデッドPub/Subを使用する場合

シャーデッドPub/Subは、Redis 7.0で導入され、クラスターモードでのPub/Subの使用をスケーリングするのに役立ちます。

参考資料: https://redis.io/docs/interact/pubsub/#sharded-pubsub

専用の adapter は、`createShardedAdapter()` メソッドを使用して作成できます。

import { Server } from "socket.io";
import { createClient } from "redis";
import { createShardedAdapter } from "@socket.io/redis-adapter";

const pubClient = createClient({ host: "localhost", port: 6379 });
const subClient = pubClient.duplicate();

await Promise.all([
pubClient.connect(),
subClient.connect()
]);

const io = new Server({
adapter: createShardedAdapter(pubClient, subClient)
});

io.listen(3000);

最低要件

注意

現在、`ioredis` パッケージと Redis クラスタを使用してシャーデッドアダプタを使用することはできません(参考資料)。

オプション

デフォルトアダプター

名前説明デフォルト値
keyRedis Pub/Subチャネルのプレフィックス。socket.io
requestsTimeoutこのタイムアウト後、アダプターはリクエストへの応答の待機を停止します。5_000
publishOnSpecificResponseChannelリクエスト元のノードに固有のチャネルに応答をパブリッシュするかどうか。false
parserRedisに送信されるメッセージのエンコードとデコードに使用するパーサー。-
ヒント

publishOnSpecificResponseChannelオプションをtrueに設定すると、応答(たとえば、fetchSockets()またはserverSideEmit()を呼び出す場合)がすべてではなく、リクエスト元のサーバーのみに送信されるため、より効率的です。サーバー。

ただし、現在、下位互換性のためにデフォルトでfalseになっています。

シャーデッドアダプター

名前説明デフォルト値
channelPrefixRedis Pub/Subチャネルのプレフィックス。socket.io
subscriptionModeサブスクリプションモードは、アダプターが使用するRedis Pub/Subチャネルの数に影響します。dynamic

よくある質問

Redisにデータは保存されますか?

いいえ、RedisアダプターはPub/Subメカニズムを使用してSocket.IOサーバー間でパケットを転送するため、Redisにキーは保存されません。

Redisアダプターを使用する場合でも、スティッキーセッションを有効にする必要がありますか?

はい。有効にしないと、HTTP 400応答が返されます(Socket.IOセッションを認識していないサーバーにアクセスしています)。

詳細については、こちらをご覧ください。

Redisサーバーがダウンした場合はどうなりますか?

Redisサーバーへの接続が切断された場合、パケットは現在のサーバーに接続されているクライアントにのみ送信されます。

socket.io-redisからの移行

Redisエミッター(@socket.io/redis-emitter)の名前と一致させるために、パッケージの名前がv7socket.io-redisから@socket.io/redis-adapterに変更されました。

新しいパッケージに移行するには、パッケージはユーザーに代わってRedisクライアントを作成しなくなるため、独自のRedisクライアントを提供する必要があることを確認してください.

変更前

const redisAdapter = require("socket.io-redis");

io.adapter(redisAdapter({ host: "localhost", port: 6379 }));

変更後

const { createClient } = require("redis");
const { createAdapter } = require("@socket.io/redis-adapter");

const pubClient = createClient({ url: "redis://localhost:6379" });
const subClient = pubClient.duplicate();

io.adapter(createAdapter(pubClient, subClient));
ヒント

Socket.IOサーバー間の通信プロトコルは更新されていないため、socket.io-redisを使用するサーバーと@socket.io/redis-adapterを使用するサーバーを同時に使用できます。

最新リリース

バージョンリリース日リリースノート差分
8.3.02024年3月リンク8.2.1...8.3.0
8.2.12023年5月リンク8.2.0...8.2.1
8.2.02023年5月リンク8.1.0...8.2.0
8.1.02023年2月リンク8.0.0...8.1.0
8.0.02022年12月リンク7.2.0...8.0.0
7.2.02022年5月リンク7.1.0...7.2.0

完全な変更履歴

エミッター

Redisエミッターを使用すると、別のNode.jsプロセスから接続されているクライアントにパケットを送信できます

Diagram of how the Redis emitter worksDiagram of how the Redis emitter works

このエミッターは、いくつかの言語でも利用できます

インストール

npm install @socket.io/redis-emitter redis

使用方法

import { Emitter } from "@socket.io/redis-emitter";
import { createClient } from "redis";

const redisClient = createClient({ url: "redis://localhost:6379" });

redisClient.connect().then(() => {
const emitter = new Emitter(redisClient);

setInterval(() => {
emitter.emit("time", new Date);
}, 5000);
});

注: redis@3を使用する場合、Redisクライアントでconnect()を呼び出す必要はありません

import { Emitter } from "@socket.io/redis-emitter";
import { createClient } from "redis";

const redisClient = createClient({ url: "redis://localhost:6379" });
const emitter = new Emitter(redisClient);

setInterval(() => {
emitter.emit("time", new Date);
}, 5000);

チートシートはこちらを参照してください。

socket.io-emitterからの移行

Redisとの関係をより明確に反映するために、パッケージの名前がv4socket.io-emitterから@socket.io/redis-emitterに変更されました。

新しいパッケージに移行するには、パッケージはユーザーに代わってRedisクライアントを作成しなくなるため、独自のRedisクライアントを提供する必要があることを確認してください.

変更前

const io = require("socket.io-emitter")({ host: "127.0.0.1", port: 6379 });

変更後

const { Emitter } = require("@socket.io/redis-emitter");
const { createClient } = require("redis");

const redisClient = createClient();
const io = new Emitter(redisClient);

最新リリース

バージョンリリース日リリースノート差分
5.1.02023年1月リンク5.0.0...5.1.0
5.0.02022年9月リンク4.1.1...5.0.0
4.1.12022年1月リンク4.1.0...4.1.1
4.1.02021年5月リンク4.0.0...4.1.0
4.0.02021年3月リンク3.2.0...4.0.0

完全な変更履歴