sgcWebSockets Berichtgeschiedenis & Herstel na Herverbinding — Mis Nooit een Bericht | eSeGeCe Blog

sgcWebSockets Berichtgeschiedenis & Herstel na Herverbinding — Mis Nooit een Bericht

· Componenten

Echte WebSocket-clients verliezen voortdurend hun verbinding: een telefoon wordt vergrendeld, wifi schakelt over naar mobiel, een tunnel hapert, een captive portal komt ertussen. Wanneer de verbinding terugkomt, zijn de berichten die tijdens de afwezigheid van de client zijn gepubliceerd verdwenen. "Ik heb berichten gemist terwijl mijn telefoon vergrendeld was" is de storing die gebruikers het eerst opmerken, en de gebruikelijke noodoplossing — bij elke herverbinding de volledige status opnieuw ophalen — is verspillend en makkelijk fout te doen.

sgcWebSockets lost dit nu rechtstreeks op. Schakel geschiedenis in op de server en een client die herverbindt speelt automatisch precies de berichten die hij gemist heeft opnieuw af, op offset. Het is optioneel en standaard uitgeschakeld, dus bestaande implementaties gedragen zich precies zoals voorheen totdat u het inschakelt. Deze post behandelt hoe het werkt, de configuratie en Delphi- en .NET-voorbeelden.

Hoe het werkt

Wanneer geschiedenis is ingeschakeld, wordt elk bericht dat naar een kanaal wordt gepubliceerd voorzien van een monotoon oplopende offset en toegevoegd aan een begrensde ringbuffer per kanaal op de server. De client onthoudt de laatste offset die hij op elk kanaal ontving. Wanneer hij herverbindt en zich opnieuw abonneert, verstuurt hij die offset, en de server speelt elk nieuwer bericht opnieuw af naar die ene verbinding — in volgorde, niets gedupliceerd.

De client draagt de offset, dus er is geen sessie aan serverzijde om te beheren. Herstel is gewoon een normaal nieuw abonnement.

Geschiedenis inschakelen op de server

Geschiedenis leeft op de sgc-protocolserver, onder een History-optieobject. Schakel het in en begrens het op berichtaantal en / of leeftijd:

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 begrenst het geheugen per kanaal (het begrenst ook wat voorheen een onbegrensde wachtrij was); TTLSeconds is een optionele leeftijdslimiet. Met geschiedenis uitgeschakeld (de standaard) is er geen offset op de lijn en geen enkele gedragsverandering.

Automatisch herstel op de client

De client houdt de offsets voor u bij. Na een herverbinding vraagt een gewone Subscribe de server automatisch om alles wat op dat kanaal gemist is opnieuw af te spelen — u hoeft niets bij te houden of door te geven:

// 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);

De offset-map per kanaal overleeft een verbroken verbinding, dus herverbinden en opnieuw abonneren is alles wat nodig is. GetLastOffset('news') stelt de cursor beschikbaar als u die wilt tonen of bewaren.

.NET

De managed editie spiegelt de API. Schakel geschiedenis in op het serverprotocol, en de client herstelt bij het opnieuw abonneren:

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");

Optioneel en standaard veilig

Geschiedenis is standaard uitgeschakeld. Wanneer het uit staat, dragen gepubliceerde frames geen offset en zijn de publicatie- / abonnementspaden byte-voor-byte zoals ze waren — dus upgraden verandert niets totdat u het expliciet inschakelt. Wanneer u het wel inschakelt, houdt de begrensde ring het geheugen voorspelbaar.

In een cluster met meerdere nodes is de geschiedenis in deze release node-lokaal: een client die opnieuw verbindt met dezelfde node krijgt volledige replay. Een gedeelde clusterbrede geschiedenis staat op de roadmap. Een direct uitvoerbare demo wordt met de bibliotheek meegeleverd (02.WebSocket_Protocols\15.MessageHistory_Recovery op Delphi, samples\HistoryRecoveryDemo op .NET): het haalt een client offline, publiceert terwijl deze weg is, verbindt hem opnieuw, en laat zien hoe hij precies de gemiste berichten herstelt.

Beschikbaarheid

Berichtgeschiedenis en herstel na herverbinding zijn beschikbaar op het sgc-protocol in Delphi 7 tot en met 13 (Win32/Win64, Linux64, macOS, Android en iOS) en op de managed .NET-editie. Het past natuurlijk bij de WatchDog auto-reconnect die sgcWebSockets-clients al hebben.

Klanten met een actief abonnement kunnen de nieuwe build downloaden uit het klantgedeelte. Trialgebruikers kunnen het bijgewerkte installatieprogramma ophalen op esegece.com/products/websockets/download.

Vragen, feedback of hulp nodig bij het inbouwen van herstel in uw app? Neem contact op — u krijgt antwoord van de mensen die de code hebben geschreven.