sgcWebSockets Histórico de Mensagens & Recuperação na Reconexão — Nunca Perca uma Mensagem | Blog eSeGeCe

sgcWebSockets Histórico de Mensagens & Recuperação na Reconexão — Nunca Perca uma Mensagem

· Componentes

Clientes WebSocket reais perdem a conexão o tempo todo: um celular bloqueia, o Wi-Fi passa para a rede móvel, um túnel falha, um portal cativo atrapalha. Quando a conexão volta, as mensagens publicadas enquanto o cliente estava ausente se perderam. "Perdi mensagens enquanto meu celular estava bloqueado" é a falha que os usuários percebem primeiro, e a solução de contorno habitual — buscar todo o estado novamente a cada reconexão — é um desperdício e fácil de fazer errado.

O sgcWebSockets agora resolve isso diretamente. Ative o histórico no servidor e um cliente que se reconecta reproduz exatamente as mensagens que perdeu, por offset. É opcional e desativado por padrão, então as implantações existentes se comportam exatamente como antes até você ativá-lo. Este post aborda como funciona, a configuração e exemplos em Delphi e .NET.

Como funciona

Quando o histórico está ativado, cada mensagem publicada em um canal recebe um offset monotonicamente crescente e é anexada a um buffer circular limitado por canal no servidor. O cliente lembra o último offset que recebeu em cada canal. Quando ele se reconecta e se reinscreve, envia esse offset, e o servidor reproduz cada mensagem mais recente para aquela única conexão — em ordem, sem nada duplicado.

O cliente carrega o offset, então não há sessão do lado do servidor para gerenciar. A recuperação é apenas uma reinscrição normal.

Ativando o histórico no servidor

O histórico fica no servidor do protocolo sgc, sob um objeto de opções History. Ative-o e limite-o por contagem de mensagens e / ou idade:

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 a memória por canal (também limita o que antes era uma fila ilimitada); TTLSeconds é um limite de idade opcional. Com o histórico desativado (o padrão), não há offset na transmissão e nenhuma mudança de comportamento alguma.

Recuperação automática no cliente

O cliente rastreia os offsets por você. Após uma reconexão, um simples Subscribe pede automaticamente ao servidor que reproduza qualquer coisa perdida naquele canal — você não precisa rastrear nem passar 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);

O mapa de offsets por canal sobrevive a uma desconexão, então reconectar e reinscrever é tudo o que é preciso. GetLastOffset('news') expõe o cursor caso você queira exibi-lo ou persisti-lo.

.NET

A edição gerenciada espelha a API. Ative o histórico no protocolo do servidor, e o cliente se recupera na reinscrição:

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 e seguro por padrão

O histórico está desativado por padrão. Quando está desativado, os frames publicados não carregam offset e os caminhos de publicação / inscrição são idênticos byte a byte ao que eram antes — então a atualização não muda nada até você ativá-lo explicitamente. Quando você o ativa, o buffer circular limitado mantém a memória previsível.

Em um cluster de múltiplos nós, o histórico é local ao nó nesta versão: um cliente que se reconecta ao mesmo nó obtém a reprodução completa. Um histórico compartilhado em todo o cluster está no roadmap. Um demo pronto para executar acompanha a biblioteca (02.WebSocket_Protocols\15.MessageHistory_Recovery no Delphi, samples\HistoryRecoveryDemo no .NET): ele coloca um cliente offline, publica enquanto ele está ausente, reconecta-o e mostra-o recuperar exatamente as mensagens que perdeu.

Disponibilidade

O histórico de mensagens e a recuperação na reconexão estão disponíveis no protocolo sgc do Delphi 7 ao 13 (Win32/Win64, Linux64, macOS, Android e iOS) e na edição gerenciada .NET. Combina naturalmente com a reconexão automática do WatchDog que os clientes sgcWebSockets já possuem.

Os clientes com uma assinatura ativa podem baixar a nova versão na área do cliente. Os usuários da versão de avaliação podem obter o instalador atualizado em esegece.com/products/websockets/download.

Dúvidas, comentários ou ajuda para integrar a recuperação no seu app? Entre em contato — você receberá uma resposta das pessoas que escreveram o código.