Ir al contenido principal
Latest blog post (July 25, 2024): npm package provenance.
Versión: 4.x

Adaptador Postgres

Cómo funciona

El adaptador Postgres se basa en los comandos NOTIFY y LISTEN.

Cada paquete que se envía a múltiples clientes (ej. io.to("room1").emit() o socket.broadcast.emit()) es:

  • enviado a todos los clientes coincidentes conectados al servidor actual
  • si el paquete contiene datos binarios o supera el límite de 8000 bytes, el paquete es:
    • codificado con msgpack e insertado en una tabla auxiliar
    • el ID de fila se envía dentro de un comando NOTIFY
    • este ID de fila es recibido por los otros servidores Socket.IO del clúster, que consultan la tabla, decodifican el paquete y luego lo transmiten a su propio conjunto de clientes conectados
  • de lo contrario, el paquete simplemente se envía dentro de un comando NOTIFY y es recibido por los otros servidores Socket.IO del clúster
Diagrama de cómo funciona el adaptador PostgresDiagrama de cómo funciona el adaptador Postgres

El código fuente de este adaptador se puede encontrar aquí.

Características soportadas

CaracterísticaVersión de socket.ioSoporte
Gestión de sockets4.0.0✅ SÍ (desde versión 0.1.0)
Comunicación entre servidores4.1.0✅ SÍ (desde versión 0.1.0)
Broadcast con acknowledgements4.5.0 ✅ SÍ (desde versión 0.3.0)
Recuperación del estado de conexión4.6.0 ❌ NO

Instalación

npm install @socket.io/postgres-adapter pg

Para usuarios de TypeScript, también podrías necesitar @types/pg.

Uso

Independiente

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

const io =newServer();

const pool =newpg.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("Error de Postgres", err);
});

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

Opciones

NombreDescripciónValor predeterminado
channelPrefixEl prefijo del canal de notificaciónsocket.io
tableNameEl nombre de la tabla para payloads sobre el límite de 8000 bytes o que contienen datos binariossocket_io_attachments
payloadThresholdEl umbral para el tamaño del payload en bytes8_000
cleanupIntervalEl número de ms entre dos consultas de limpieza30_000
heartbeatIntervalEl número de ms entre dos heartbeats5_000
heartbeatTimeoutEl número de ms sin heartbeat antes de considerar un nodo caído10_000

Preguntas frecuentes

¿Todavía necesito habilitar sesiones sticky al usar el adaptador Postgres?

Sí. No hacerlo resultará en respuestas HTTP 400 (estás llegando a un servidor que no conoce la sesión Socket.IO).

Más información se puede encontrar aquí.

¿Qué pasa cuando el servidor Postgres está caído?

En caso de que la conexión al servidor Postgres se corte, los paquetes solo se enviarán a los clientes que están conectados al servidor actual.

Últimas versiones

VersiónFecha de lanzamientoNotas de lanzamientoDiff
0.5.0Noviembre 2025link 0.4.0...0.5.0
0.4.0Julio 2024link 0.3.1...0.4.0
0.3.1Febrero 2023link 0.3.0...0.3.1
0.3.0Abril 2022link 0.2.0...0.3.0
0.2.0Diciembre 2021link 0.1.1...0.2.0

Changelog completo

Emitter

El emitter Postgres permite enviar paquetes a los clientes conectados desde otro proceso Node.js:

Diagrama de cómo funciona el emitter PostgresDiagrama de cómo funciona el emitter Postgres

Instalación

npm install @socket.io/postgres-emitter pg

Uso

import{Emitter}from"@socket.io/postgres-emitter";
import{Pool}from"pg";

const pool =newPool({
user:"postgres",
password:"changeit",
});

const emitter =newEmitter(pool);

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

Por favor consulta la hoja de referencia aquí.

Últimas versiones

VersiónFecha de lanzamientoNotas de lanzamientoDiff
0.1.0Junio 2021link

Changelog completo

AltStyle によって変換されたページ (->オリジナル) /