MongoDBアダプター
仕組み
MongoDBアダプターは、MongoDBのChange Streamsに依存します(したがって、レプリカセットまたはシャーディングされたクラスターが必要です)。
複数のクライアントに送信されるすべてのパケット(例:io.to("room1").emit()
またはsocket.broadcast.emit()
)は
- 現在のサーバーに接続しているすべてのマッチするクライアントに送信され
- MongoDBの固定コレクションに挿入され、クラスターの他のSocket.IOサーバーによって受信されます


このアダプターのソースコードはこちらにあります。
サポートされる機能
機能 | socket.io バージョン | サポート |
---|---|---|
ソケット管理 | 4.0.0 | ✅ はい(バージョン0.1.0 以降) |
サーバー間通信 | 4.1.0 | ✅ はい(バージョン0.1.0 以降) |
確認応答付きブロードキャスト | 4.5.0 | ✅ はい(バージョン0.2.0 以降) |
接続状態の復旧 | 4.6.0 | ✅ はい(バージョン0.3.0 以降) |
インストール
npm install @socket.io/mongo-adapter mongodb
TypeScriptユーザーの場合は、@types/mongodb
も必要になる場合があります。
使い方
Socket.IOクラスター内でのパケットのブロードキャストは、MongoDBドキュメントを作成し、各Socket.IOサーバーで変更ストリームを使用することで実現されます。
MongoDBのドキュメントをクリーンアップするには、2つの方法があります。
固定コレクションを使った使い方
import { Server } from "socket.io";
import { createAdapter } from "@socket.io/mongo-adapter";
import { MongoClient } from "mongodb";
const DB = "mydb";
const COLLECTION = "socket.io-adapter-events";
const io = new Server();
const mongoClient = new MongoClient("mongodb://localhost:27017/?replicaSet=rs0");
await mongoClient.connect();
try {
await mongoClient.db(DB).createCollection(COLLECTION, {
capped: true,
size: 1e6
});
} catch (e) {
// collection already exists
}
const mongoCollection = mongoClient.db(DB).collection(COLLECTION);
io.adapter(createAdapter(mongoCollection));
io.listen(3000);
TTLインデックスを使った使い方
import { Server } from "socket.io";
import { createAdapter } from "@socket.io/mongo-adapter";
import { MongoClient } from "mongodb";
const DB = "mydb";
const COLLECTION = "socket.io-adapter-events";
const io = new Server();
const mongoClient = new MongoClient("mongodb://localhost:27017/?replicaSet=rs0");
await mongoClient.connect();
const mongoCollection = mongoClient.db(DB).collection(COLLECTION);
await mongoCollection.createIndex(
{ createdAt: 1 },
{ expireAfterSeconds: 3600, background: true }
);
io.adapter(createAdapter(mongoCollection, {
addCreatedAtField: true
}));
io.listen(3000);
オプション
名前 | 説明 | デフォルト値 | 追加されたバージョン |
---|---|---|---|
uid | このノードのID | ランダムなID | v0.1.0 |
requestsTimeout | fetchSockets() や確認応答付きのserverSideEmit() などのサーバー間リクエストのタイムアウト | 5000 | v0.1.0 |
heartbeatInterval | 2つのハートビート間のms数 | 5000 | v0.1.0 |
heartbeatTimeout | ノードがダウンしているとみなすまでのハートビートがない状態のms数 | 10000 | v0.1.0 |
addCreatedAtField | 各MongoDBドキュメントにcreatedAt フィールドを追加するかどうか | false | v0.2.0 |
よくある質問
MongoDBアダプターを使用する場合でも、スティッキーセッションを有効にする必要がありますか?
はい。そうしないと、HTTP 400レスポンスが発生します(Socket.IOセッションを認識していないサーバーにアクセスしています)。
詳細については、こちらをご覧ください。
MongoDBクラスターがダウンした場合はどうなりますか?
MongoDBクラスターへの接続が切断された場合、動作はMongoDBクライアントのbufferMaxEntries
オプションの値によって異なります。
- その値が
-1
(デフォルト)の場合、パケットは再接続までバッファリングされます。 - その値が
0
の場合、パケットは現在のサーバーに接続しているクライアントにのみ送信されます。
ドキュメント: http://mongodb.github.io/node-mongodb-native/3.6/api/global.html#MongoClientOptions
最新リリース
バージョン | リリース日 | リリースノート | 差分 |
---|---|---|---|
0.3.2 | 2024年1月 | リンク | 0.3.1...0.3.2 |
0.3.1 | 2024年1月 | リンク | 0.3.0...0.3.1 |
0.3.0 | 2023年2月 | リンク | 0.2.1...0.3.0 |
0.2.1 | 2022年5月 | リンク | 0.2.0...0.2.1 |
0.2.0 | 2022年4月 | リンク | 0.1.0...0.2.0 |
0.1.0 | 2021年6月 | リンク |
エミッター
MongoDBエミッターを使用すると、別のNode.jsプロセスから接続されたクライアントにパケットを送信できます


インストール
npm install @socket.io/mongo-emitter mongodb
使い方
const { Emitter } = require("@socket.io/mongo-emitter");
const { MongoClient } = require("mongodb");
const mongoClient = new MongoClient("mongodb://localhost:27017/?replicaSet=rs0");
const main = async () => {
await mongoClient.connect();
const mongoCollection = mongoClient.db("mydb").collection("socket.io-adapter-events");
const emitter = new Emitter(mongoCollection);
setInterval(() => {
emitter.emit("ping", new Date());
}, 1000);
}
main();
チートシートこちらを参照してください。