Ana içeriğe geç

MongoDB adaptörü

Nasıl çalışır

MongoDB adaptörü, MongoDB'nin Change Streams özelliğine dayanır (ve bu nedenle bir replikasyon seti veya parçalı bir kümeye ihtiyaç duyar).

Birden çok istemciye gönderilen her paket (örneğin, io.to("room1").emit() veya socket.broadcast.emit()) şunları yapar:

  • mevcut sunucuya bağlı olan tüm eşleşen istemcilere gönderilir
  • MongoDB sınırlı bir koleksiyonuna eklenir ve kümenin diğer Socket.IO sunucuları tarafından alınır

Bu adaptörün kaynak koduna buradan ulaşabilirsiniz.

Desteklenen özellikler

Özelliksocket.io sürümüDestek
Socket yönetimi4.0.0✅ Evet (sürüm 0.1.0'dan itibaren)
Sunucular arası iletişim4.1.0✅ Evet (sürüm 0.1.0'dan itibaren)
Onaylı yayınlama4.5.0✅ Evet (sürüm 0.2.0'dan itibaren)
Bağlantı durumu kurtarma4.6.0✅ Evet (sürüm 0.3.0'dan itibaren)

Kurulum

npm install @socket.io/mongo-adapter mongodb

TypeScript kullanıcıları için, ayrıca @types/mongodb de gerekli olabilir.

Kullanım

Socket.IO kümesi içinde paket yayınlama, MongoDB belgeleri oluşturarak ve her Socket.IO sunucusunda bir change stream kullanarak gerçekleştirilir.

MongoDB'deki belgeleri temizlemenin iki yolu vardır:

Sınırlı koleksiyon ile kullanım

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) {
// koleksiyon zaten var
}
const mongoCollection = mongoClient.db(DB).collection(COLLECTION);

io.adapter(createAdapter(mongoCollection));
io.listen(3000);

TTL indeksi ile kullanım

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

Seçenekler

İsimAçıklamaVarsayılan değerEklendi
uidbu düğümün kimliğirastgele bir idv0.1.0
requestsTimeoutfetchSockets() veya serverSideEmit() gibi sunucular arası istekler için zaman aşımı5000v0.1.0
heartbeatIntervaliki kalp atışı arasındaki ms sayısı5000v0.1.0
heartbeatTimeoutbir düğümün kapalı olduğu kabul edilmeden önce kalp atışı olmadan geçen ms sayısı10000v0.1.0
addCreatedAtFieldher MongoDB belgesine createdAt alanı eklenip eklenmeyeceğifalsev0.2.0

Sıkça Sorulan Sorular

MongoDB adaptörü kullanırken hala yapışkan oturumları etkinleştirmem gerekiyor mu?

ipucu

Evet. Bunu yapmamak, HTTP 400 yanıtlarına neden olacaktır (Socket.IO oturumu hakkında bilgi sahibi olmayan bir sunucuya ulaşmaya çalışıyorsunuz).

Daha fazla bilgi burada bulunabilir.

MongoDB kümesi kapalı olduğunda ne olur?

MongoDB kümesine bağlantı kesilirse, davranış MongoDB istemcisinin bufferMaxEntries seçeneğinin değerine bağlı olacaktır:

  • değeri -1 (varsayılan) ise, paketler yeniden bağlantı sağlanana kadar yığılacaktır.
  • değeri 0 ise, paketler yalnızca mevcut sunucuya bağlı olan istemcilere gönderilecektir.

Belgeler: http://mongodb.github.io/node-mongodb-native/3.6/api/global.html#MongoClientOptions

Son Sürümler

SürümYayın tarihiYayın notlarıFark
0.3.2Ocak 2024link0.3.1...0.3.2
0.3.1Ocak 2024link0.3.0...0.3.1
0.3.0Şubat 2023link0.2.1...0.3.0
0.2.1Mayıs 2022link0.2.0...0.2.1
0.2.0Nisan 2022link0.1.0...0.2.0
0.1.0Haziran 2021link

Tam değişiklik günlüğü

Yayıncı

MongoDB yayıncısı, başka bir Node.js işleminden bağlı istemcilere paket göndermeyi sağlar:

Kurulum

npm install @socket.io/mongo-emitter mongodb

Kullanım

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

Lütfen burada hızlı referansa bakın.