Ana içeriğe geç

Postgres adaptörü

Nasıl çalışır

Postgres adaptörü, NOTIFY ve LISTEN komutlarına dayanır.

Birden fazla istemciye (örneğin, io.to("room1").emit() veya socket.broadcast.emit()) gönderilen her paket:

  • mevcut sunucuya bağlı tüm eşleşen istemcilere gönderilir
  • paket ikili veri içeriyorsa veya 8000 bayt sınırını aşıyorsa, paket:
    • msgpack ile kodlanır ve yardımcı bir tabloya eklenir
    • satır ID'si bir NOTIFY komutu içinde gönderilir
    • bu satır ID'si kümenin diğer Socket.IO sunucuları tarafından alınır, tablo sorgulanır, paket çözülür ve ardından kendi bağlı istemcilerine yayınlanır
  • aksi takdirde, paket basitçe bir NOTIFY komutu içinde gönderilir ve kümenin diğer Socket.IO sunucuları tarafından alınır

Bu adaptörün kaynak kodu burada bulunabilir.

Desteklenen özellikler

Özelliksocket.io sürümüDestek
Socket yönetimi4.0.0✅ EVET (sürüm 0.1.0 itibarıyla)
Sunucular arası iletişim4.1.0✅ EVET (sürüm 0.1.0 itibarıyla)
Onaylı yayın4.5.0✅ EVET (sürüm 0.3.0 itibarıyla)
Bağlantı durumu geri yükleme4.6.0❌ HAYIR

Kurulum

ipucu

Dikkat: Aşağıdaki komutu çalıştırarak gerekli paketleri yükleyin.

npm install @socket.io/postgres-adapter pg

TypeScript kullanıcıları, ayrıca @types/pg gerektiğini görebilir.

Kullanım

import { Server } from "socket.io";
import { createAdapter } from "@socket.io/postgres-adapter";
import pg from "pg";

const io = new Server();

const pool = new pg.Pool({
user: "postgres",
host: "localhost",
database: "postgres",
password: "changeit",
port: 5432,
});

pool.query(`
CREATE TABLE IF NOT EXISTS socket_io_attachments (
id bigserial UNIQUE,
created_at timestamptz DEFAULT NOW(),
payload bytea
);
`);

pool.on("error", (err) => {
console.error("Postgres hatası", err);
});

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

Seçenekler

İsimAçıklamaVarsayılan değer
uidbu düğümün ID'sirastgele bir ID
channelPrefixbildirim kanalının ön ekisocket.io
tableName8000 bayt sınırını aşan veya ikili veri içeren yükler için tablonun adısocket_io_attachments
payloadThresholdbayt cinsinden yük boyutu için eşik8000
requestsTimeoutfetchSockets() veya serverSideEmit() gibi sunucular arası istekler için zaman aşıma süresi5000
heartbeatIntervaliki kalp atışı arasında geçen ms sayısı5000
heartbeatTimeoutbir düğümün kapalı olduğunu düşünmeden önce kalp atışsız geçen ms sayısı10000
cleanupIntervaliki temizlik sorgusu arasında geçen ms sayısı30000

Sıkça sorulan sorular

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

Evet. Bunu yapmamak, HTTP 400 yanıtlarına yol açar (Socket.IO oturumunu bilmeyen bir sunucuya ulaşıyorsunuz).

Daha fazla bilgi burada bulunabilir.

Postgres sunucusu kapalıyken ne olur?

Postgres sunucusuna bağlantı kesilirse, paketler yalnızca mevcut sunucuya bağlı istemcilere gönderilecektir.

Son sürümler

SürümYayın tarihiYayın notlarıFark
0.4.0Temmuz 2024link0.3.1...0.4.0
0.3.1Şubat 2023link0.3.0...0.3.1
0.3.0Nisan 2022link0.2.0...0.3.0
0.2.0Aralık 2021link0.1.1...0.2.0
0.1.1Haziran 2021link0.1.0...0.1.1
0.1.0Haziran 2021link

Tam değişiklik kaydı

Yayıncı

Postgres yayıncısı, başka bir Node.js sürecinden bağlı istemcilere paket gönderilmesine olanak tanır:

Kurulum

npm install @socket.io/postgres-emitter pg

Kullanım

const { Emitter } = require("@socket.io/postgres-emitter");
const { Pool } = require("pg");

const pool = new Pool({
user: "postgres",
host: "localhost",
database: "postgres",
password: "changeit",
port: 5432,
});

const emitter = new Emitter(pool);

setInterval(() => {
emitter.emit("ping", new Date());
}, 1000);

Lütfen antrenman notlarına buradan bakın.

Son sürümler

SürümYayın tarihiYayın notlarıFark
0.1.0Haziran 2021link

Tam değişiklik kaydı