sgcWebSockets Historial de Mensajes y Recuperación al Reconectar — No Pierdas Ningún Mensaje | eSeGeCe Blog

sgcWebSockets Historial de Mensajes y Recuperación al Reconectar — No Pierdas Ningún Mensaje

· Componentes

Los clientes WebSocket reales pierden su conexión constantemente: un teléfono se bloquea, el Wi-Fi cambia a datos móviles, un túnel tiene un fallo, un portal cautivo se interpone. Cuando la conexión vuelve, los mensajes publicados mientras el cliente estaba ausente han desaparecido. «Me perdí mensajes mientras tenía el teléfono bloqueado» es el fallo que los usuarios notan primero, y la solución habitual — volver a obtener todo el estado en cada reconexión — es un desperdicio y fácil de equivocar.

sgcWebSockets ahora resuelve esto directamente. Activa el historial en el servidor y un cliente que se reconecta reproduce exactamente los mensajes que se perdió, por offset. Es opcional y está desactivado por defecto, de modo que las implementaciones existentes se comportan exactamente igual que antes hasta que lo actives. Esta entrada cubre cómo funciona, la configuración y ejemplos en Delphi y .NET.

Cómo funciona

Cuando el historial está activado, cada mensaje publicado en un canal se sella con un offset que aumenta de forma monótona y se añade a un búfer circular acotado por canal en el servidor. El cliente recuerda el último offset que recibió en cada canal. Cuando se reconecta y se vuelve a suscribir, envía ese offset, y el servidor reproduce todos los mensajes más nuevos en esa única conexión — en orden, sin nada duplicado.

El cliente lleva el offset, por lo que no hay ninguna sesión en el lado del servidor que gestionar. La recuperación es simplemente volver a suscribirse de forma normal.

Activar el historial en el servidor

El historial reside en el servidor del protocolo sgc, dentro de un objeto de opciones History. Actívalo y acótalo por número de mensajes y/o antigüedad:

uses
  sgcWebSocket, sgcWebSocket_Protocols;

var
  oProtocol: TsgcWSPServer_sgc;
begin
  oProtocol := TsgcWSPServer_sgc.Create(nil);
  oProtocol.Server := oServer;

  oProtocol.History.Enabled    := True;
  oProtocol.History.Size       := 1000;   // keep the last 1000 messages per channel
  oProtocol.History.TTLSeconds := 3600;   // optional: also drop entries older than 1 hour
end;

Size limita la memoria por canal (también acota lo que antes era una cola sin límite); TTLSeconds es un límite de antigüedad opcional. Con el historial desactivado (el valor por defecto) no hay ningún offset en el cable ni ningún cambio de comportamiento en absoluto.

Recuperación automática en el cliente

El cliente rastrea los offsets por ti. Tras una reconexión, una simple llamada a Subscribe pide automáticamente al servidor que reproduzca todo lo que se perdió en ese canal — no tienes que rastrear ni pasar nada:

// On (re)connect, just resubscribe. The client auto-sends the last offset it saw,
// and the server replays the messages published while the client was offline.
sgcWSPClient_sgc1.Subscribe('news');

// Or request the full retained history explicitly (cursor 0 = everything kept):
sgcWSPClient_sgc1.Subscribe('news', 0);

El mapa de offsets por canal sobrevive a una desconexión, así que reconectar y volver a suscribirse es todo lo que hace falta. GetLastOffset('news') expone el cursor por si quieres mostrarlo o persistirlo.

.NET

La edición gestionada replica la API. Activa el historial en el protocolo del servidor, y el cliente se recupera al volver a suscribirse:

var protocol = new TsgcWSPServer_sgc { Server = server };
protocol.History.Enabled    = true;
protocol.History.Size       = 1000;
protocol.History.TtlSeconds = 3600;

// Client: a plain resubscribe after reconnect recovers the missed messages.
client.Subscribe("news");
long last = client.GetLastOffset("news");

Opcional y seguro por defecto

El historial está desactivado por defecto. Cuando está desactivado, los frames publicados no llevan ningún offset y las rutas de publicación/suscripción son byte por byte lo que eran antes — así que actualizar no cambia nada hasta que lo actives explícitamente. Cuando sí lo activas, el búfer circular acotado mantiene la memoria predecible.

En un clúster multinodo, el historial es local a cada nodo en esta versión: un cliente que se reconecta al mismo nodo obtiene la reproducción completa. Un historial compartido a nivel de todo el clúster está en la hoja de ruta. Con la biblioteca se incluye una demo lista para ejecutar (02.WebSocket_Protocols\15.MessageHistory_Recovery en Delphi, samples\HistoryRecoveryDemo en .NET): pone a un cliente sin conexión, publica mientras está ausente, lo reconecta y muestra cómo recupera exactamente los mensajes que se perdió.

Disponibilidad

El historial de mensajes y la recuperación al reconectar están disponibles en el protocolo sgc en Delphi 7 hasta 13 (Win32/Win64, Linux64, macOS, Android e iOS) y en la edición gestionada de .NET. Se combina de forma natural con la reconexión automática de WatchDog que los clientes de sgcWebSockets ya tienen.

Los clientes con una suscripción activa pueden descargar la nueva compilación desde el área de clientes. Los usuarios de prueba pueden obtener el instalador actualizado en esegece.com/products/websockets/download.

¿Preguntas, comentarios o ayuda para integrar la recuperación en tu aplicación? Ponte en contacto — recibirás respuesta de las personas que escribieron el código.