I client WebSocket reali perdono la connessione di continuo: un telefono si blocca, il Wi-Fi passa alla rete cellulare, un tunnel ha un singhiozzo, un captive portal si mette di mezzo. Quando la connessione torna, i messaggi pubblicati mentre il client era assente sono spariti. "Ho perso dei messaggi mentre il telefono era bloccato" è il guasto che gli utenti notano per primo, e la soluzione abituale — ricaricare l'intero stato a ogni riconnessione — è dispendiosa e facile da sbagliare.
sgcWebSockets ora risolve direttamente questo problema. Abilitate la cronologia sul server e un client che si riconnette riproduce esattamente i messaggi che ha mancato, per offset. È opzionale e disattivata di default, quindi le installazioni esistenti si comportano esattamente come prima finché non la attivate. Questo articolo spiega come funziona, la configurazione e gli esempi Delphi e .NET.
Come funziona
Quando la cronologia è abilitata, ogni messaggio pubblicato su un canale viene marcato con un offset monotonicamente crescente e accodato a un ring buffer limitato per canale sul server. Il client ricorda l'ultimo offset ricevuto su ciascun canale. Quando si riconnette e si riscrive (resubscribe), invia quell'offset, e il server riproduce ogni messaggio più recente verso quella singola connessione — in ordine, senza nulla di duplicato.
Il client porta con sé l'offset, quindi non c'è alcuna sessione lato server da gestire. Il ripristino è una normale nuova sottoscrizione.
Abilitare la cronologia sul server
La cronologia risiede sul server di protocollo sgc, sotto un oggetto di opzioni History. Attivatela e limitatela per numero di messaggi e / o per età:
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 per canale (limita anche quella che prima era una coda illimitata); TTLSeconds è un limite di età opzionale. Con la cronologia disabilitata (il default) non c'è alcun offset sul filo e nessuna modifica di comportamento.
Ripristino automatico sul client
Il client tiene traccia degli offset per voi. Dopo una riconnessione, un semplice Subscribe chiede automaticamente al server di riprodurre qualsiasi cosa sia stata mancata su quel canale — non dovete tracciare o passare nulla:
// 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);
La mappa degli offset per canale sopravvive a una disconnessione, quindi riconnettersi e riscriversi è tutto ciò che serve. GetLastOffset('news') espone il cursore se volete mostrarlo o renderlo persistente.
.NET
L'edizione gestita rispecchia l'API. Abilitate la cronologia sul protocollo del server, e il client ripristina alla nuova sottoscrizione:
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");
Opzionale e sicura di default
La cronologia è disattivata di default. Quando è disattivata, i frame pubblicati non trasportano alcun offset e i percorsi di pubblicazione / sottoscrizione sono byte per byte quelli di prima — quindi l'aggiornamento non cambia nulla finché non la abilitate esplicitamente. Quando la abilitate, il ring limitato mantiene la memoria prevedibile.
In un cluster multi-nodo la cronologia è locale al nodo in questa release: un client che si riconnette allo stesso nodo ottiene la riproduzione completa. Una cronologia condivisa a livello di cluster è nella roadmap. Una demo pronta all'uso è inclusa con la libreria (02.WebSocket_Protocols\15.MessageHistory_Recovery su Delphi, samples\HistoryRecoveryDemo su .NET): porta un client offline, pubblica mentre è assente, lo riconnette e mostra come ripristina esattamente i messaggi che ha mancato.
Disponibilità
La cronologia dei messaggi e il ripristino alla riconnessione sono disponibili sul protocollo sgc da Delphi 7 fino a 13 (Win32/Win64, Linux64, macOS, Android e iOS) e sull'edizione gestita .NET. Si abbina naturalmente alla riconnessione automatica WatchDog che i client sgcWebSockets già possiedono.
I clienti con un abbonamento attivo possono scaricare la nuova build dall'area clienti. Gli utenti di prova possono ottenere l'installer aggiornato su esegece.com/products/websockets/download.
Domande, feedback o aiuto per integrare il ripristino nella vostra app? Contattateci — riceverete una risposta dalle persone che hanno scritto il codice.
