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

MongoDBアダプター

仕組み

MongoDBアダプターは、MongoDBのChange Streamsに依存します(したがって、レプリカセットまたはシャーディングされたクラスターが必要です)。

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

  • 現在のサーバーに接続しているすべてのマッチするクライアントに送信され
  • MongoDBの固定コレクションに挿入され、クラスターの他のSocket.IOサーバーによって受信されます
Diagram of how the MongoDB adapter worksDiagram of how the MongoDB adapter works

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

サポートされる機能

機能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ランダムなIDv0.1.0
requestsTimeoutfetchSockets()や確認応答付きのserverSideEmit()などのサーバー間リクエストのタイムアウト5000v0.1.0
heartbeatInterval2つのハートビート間のms数5000v0.1.0
heartbeatTimeoutノードがダウンしているとみなすまでのハートビートがない状態のms数10000v0.1.0
addCreatedAtField各MongoDBドキュメントにcreatedAtフィールドを追加するかどうかfalsev0.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.22024年1月リンク0.3.1...0.3.2
0.3.12024年1月リンク0.3.0...0.3.1
0.3.02023年2月リンク0.2.1...0.3.0
0.2.12022年5月リンク0.2.0...0.2.1
0.2.02022年4月リンク0.1.0...0.2.0
0.1.02021年6月リンク

完全な変更履歴

エミッター

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

Diagram of how the MongoDB adapter worksDiagram of how the MongoDB adapter works

インストール

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();

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