Les vrais clients WebSocket perdent leur connexion en permanence : un téléphone se verrouille, le Wi-Fi bascule sur le réseau cellulaire, un tunnel a un hoquet, un portail captif s'interpose. Lorsque la connexion revient, les messages publiés pendant l'absence du client ont disparu. « J'ai manqué des messages pendant que mon téléphone était verrouillé » est la défaillance que les utilisateurs remarquent en premier, et la solution de contournement habituelle — recharger l'intégralité de l'état à chaque reconnexion — est coûteuse et facile à rater.
sgcWebSockets résout désormais ce problème directement. Activez l'historique sur le serveur et un client qui se reconnecte rejoue exactement les messages qu'il a manqués, par offset. C'est optionnel et désactivé par défaut, de sorte que les déploiements existants se comportent exactement comme avant jusqu'à ce que vous l'activiez. Cet article explique comment cela fonctionne, la configuration, ainsi que des exemples Delphi et .NET.
Comment ça fonctionne
Lorsque l'historique est activé, chaque message publié sur un canal est estampillé d'un offset croissant de façon monotone et ajouté à un tampon circulaire borné par canal sur le serveur. Le client mémorise le dernier offset qu'il a reçu sur chaque canal. Lorsqu'il se reconnecte et se réabonne, il envoie cet offset, et le serveur rejoue chaque message plus récent vers cette seule connexion — dans l'ordre, sans aucun doublon.
Le client porte l'offset, il n'y a donc aucune session côté serveur à gérer. La récupération n'est qu'un réabonnement normal.
Activer l'historique sur le serveur
L'historique réside sur le serveur de protocole sgc, dans un objet d'options History. Activez-le et bornez-le par nombre de messages et / ou par âge :
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 plafonne la mémoire par canal (il borne aussi ce qui était auparavant une file d'attente non bornée) ; TTLSeconds est une limite d'âge optionnelle. Avec l'historique désactivé (le défaut), il n'y a aucun offset sur le réseau et aucun changement de comportement.
Récupération automatique sur le client
Le client suit les offsets à votre place. Après une reconnexion, un simple Subscribe demande automatiquement au serveur de rejouer tout ce qui a été manqué sur ce canal — vous n'avez rien à suivre ni à transmettre :
// 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 table des offsets par canal survit à une déconnexion, il suffit donc de se reconnecter et de se réabonner. GetLastOffset('news') expose le curseur si vous souhaitez l'afficher ou le persister.
.NET
L'édition managée reflète l'API. Activez l'historique sur le protocole serveur, et le client récupère lors du réabonnement :
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");
Optionnel et sûr par défaut
L'historique est désactivé par défaut. Lorsqu'il est désactivé, les trames publiées ne portent aucun offset et les chemins de publication / abonnement sont octet pour octet ce qu'ils étaient auparavant — ainsi la mise à jour ne change rien jusqu'à ce que vous l'activiez explicitement. Lorsque vous l'activez, le tampon circulaire borné maintient la mémoire prévisible.
Dans un cluster multi-nœuds, l'historique est local au nœud dans cette version : un client qui se reconnecte au même nœud obtient un rejeu complet. Un historique partagé à l'échelle du cluster est prévu dans la feuille de route. Une démo prête à l'emploi est livrée avec la bibliothèque (02.WebSocket_Protocols\15.MessageHistory_Recovery sous Delphi, samples\HistoryRecoveryDemo sous .NET) : elle met un client hors ligne, publie pendant son absence, le reconnecte, et montre qu'il récupère exactement les messages qu'il a manqués.
Disponibilité
L'historique des messages et la récupération à la reconnexion sont disponibles sur le protocole sgc de Delphi 7 à 13 (Win32/Win64, Linux64, macOS, Android et iOS) ainsi que sur l'édition managée .NET. Cela se marie naturellement avec la reconnexion automatique WatchDog dont disposent déjà les clients sgcWebSockets.
Les clients disposant d'un abonnement actif peuvent télécharger la nouvelle version depuis l'espace client. Les utilisateurs en version d'essai peuvent récupérer l'installeur mis à jour sur esegece.com/products/websockets/download.
Des questions, des retours ou besoin d'aide pour intégrer la récupération dans votre application ? Contactez-nous — vous recevrez une réponse des personnes qui ont écrit le code.
