sgcWebSockets Mesaj Geçmişi & Yeniden Bağlanma Kurtarması — Hiçbir Mesajı Kaçırmayın | eSeGeCe Blog

sgcWebSockets Mesaj Geçmişi & Yeniden Bağlanma Kurtarması — Hiçbir Mesajı Kaçırmayın

· Bileşenler

Gerçek WebSocket istemcileri sürekli olarak bağlantılarını kaybeder: telefon kilitlenir, Wi-Fi hücresel bağlantıya geçer, bir tünelde kesinti olur, bir oturum açma portalı araya girer. Bağlantı geri geldiğinde, istemci uzaktayken yayımlanan mesajlar kaybolur. "Telefonum kilitliyken mesajları kaçırdım" kullanıcıların ilk fark ettiği hatadır ve alışılmış geçici çözüm — her yeniden bağlanmada tüm durumu yeniden çekmek — israf olur ve yanlış yapılması kolaydır.

sgcWebSockets artık bunu doğrudan çözer. Sunucuda geçmişi etkinleştirin; yeniden bağlanan bir istemci, kaçırdığı mesajları tam olarak yeniden oynatır, offset değerine göre. Bu özellik isteğe bağlıdır ve varsayılan olarak kapalıdır; bu nedenle siz açana kadar mevcut dağıtımlar tıpkı önceki gibi davranır. Bu yazı, bunun nasıl çalıştığını, yapılandırmayı ve Delphi ile .NET örneklerini ele alır.

Nasıl çalışır

Geçmiş etkinleştirildiğinde, bir kanala yayımlanan her mesaj, monoton biçimde artan bir offset değeriyle damgalanır ve sunucudaki kanal başına sınırlı bir halka tamponuna (ring buffer) eklenir. İstemci, her kanalda aldığı son offset değerini hatırlar. Yeniden bağlanıp yeniden abone olduğunda bu offset değerini gönderir ve sunucu, daha yeni olan her mesajı yalnızca o bağlantıya yeniden oynatır — sırayla, hiçbir şey çoğaltılmadan.

Offset değerini istemci taşır; bu nedenle yönetilecek sunucu tarafı bir oturum yoktur. Kurtarma yalnızca normal bir yeniden aboneliktir.

Sunucuda geçmişi etkinleştirme

Geçmiş, sgc protokol sunucusunda, bir History seçenekleri nesnesi altında bulunur. Onu açın ve mesaj sayısına ve / veya yaşa göre sınırlayın:

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, kanal başına belleği sınırlar (ayrıca eskiden sınırsız olan kuyruğu da sınırlar); TTLSeconds isteğe bağlı bir yaş sınırıdır. Geçmiş devre dışıyken (varsayılan) hatta hiçbir offset yoktur ve hiçbir davranış değişikliği olmaz.

İstemcide otomatik kurtarma

İstemci, offset değerlerini sizin için izler. Yeniden bağlandıktan sonra, düz bir Subscribe çağrısı, o kanalda kaçırılan her şeyi yeniden oynatması için sunucudan otomatik olarak ister — hiçbir şeyi izlemeniz veya iletmeniz gerekmez:

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

Kanal başına offset haritası bir bağlantı kopmasından sağ çıkar; bu nedenle yeniden bağlanıp yeniden abone olmak yeterlidir. GetLastOffset('news'), imleci görüntülemek veya kalıcı hale getirmek isterseniz onu açığa çıkarır.

.NET

Yönetilen sürüm, API'yi yansıtır. Sunucu protokolünde geçmişi etkinleştirin; istemci yeniden abone olduğunda kurtarma yapar:

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

İsteğe bağlı ve varsayılan olarak güvenli

Geçmiş varsayılan olarak kapalıdır. Kapalıyken, yayımlanan çerçeveler hiçbir offset taşımaz ve yayımlama / abone olma yolları öncekiyle birebir aynıdır — bu nedenle açıkça etkinleştirene kadar yükseltme hiçbir şeyi değiştirmez. Etkinleştirdiğinizde, sınırlı halka tamponu belleği öngörülebilir tutar.

Çok düğümlü bir kümede, bu sürümde geçmiş düğüme yereldir: aynı düğüme yeniden bağlanan bir istemci tam yeniden oynatma alır. Küme genelinde paylaşılan bir geçmiş, yol haritasındadır. Kütüphaneyle birlikte çalışmaya hazır bir demo gelir (Delphi'de 02.WebSocket_Protocols\15.MessageHistory_Recovery, .NET'te samples\HistoryRecoveryDemo): bir istemciyi çevrimdışı yapar, o uzaktayken yayım yapar, onu yeniden bağlar ve kaçırdığı mesajları tam olarak kurtardığını gösterir.

Kullanılabilirlik

Mesaj geçmişi ve yeniden bağlanma kurtarması, Delphi 7'den 13'e kadar (Win32/Win64, Linux64, macOS, Android ve iOS) sgc protokolünde ve yönetilen .NET sürümünde kullanılabilir. sgcWebSockets istemcilerinin halihazırda sahip olduğu WatchDog otomatik yeniden bağlanma özelliğiyle doğal olarak eşleşir.

Aktif aboneliği olan müşteriler yeni derlemeyi müşteri alanından indirebilir. Deneme kullanıcıları, güncellenmiş yükleyiciyi esegece.com/products/websockets/download adresinden edinebilir.

Sorularınız, geri bildirimleriniz mi var ya da kurtarmayı uygulamanıza entegre etmek için yardıma mı ihtiyacınız var? Bize ulaşın — kodu yazan kişilerden bir yanıt alacaksınız.