Tek bir işlemde çalışan bir WebSocket sunucusu kolaydır. Bir yük dengeleyicinin arkasına iki veya daha fazla sunucu örneği koyduğunuz anda, bir şey sessizce bozulur: her istemci tam olarak bir düğüme bağlanır, bu nedenle A düğümünde yayınlanan bir mesaj asla B düğümünde oturan abonelere ulaşmaz. Kanallar, yayınlar ve Presence'ın hepsi yarı kör kalır. Bu, ekiplerin bir WebSocket kütüphanesini aşmasının ve başka bir yere geçmesinin tek başına en yaygın nedenidir.
Yeni TsgcWSCluster bileşeni bu boşluğu kapatır. Onu sunucunuzun yanına yerleştirin, düğümleri birbirine yönlendirin; herhangi bir düğümdeki yayın veya Presence olayı, mevcut Publish / kanal / Presence kodunuz değişmeden her düğüme bağlı abonelere ulaşır. Bu yazı, iki arka düzlem motorunu, yapılandırmayı ve kopyalanmaya hazır Delphi ve .NET örneklerini adım adım anlatır.
İki arka düzlem motoru
Kümeleme, her düğümün bağlandığı bir arka düzlem aracılığıyla çalışır. Bir istemci bir düğümde yayın yaptığında, o düğüm mesajı kendi yerel abonelerine iletir ve arka düzleme aktarır; diğer her düğüm onu alır ve kendi yerel abonelerine dağıtır. Döngüler, her mesajın kaynak düğüm kimliğiyle etiketlenmesiyle önlenir.
Arka düzlemi EngineType özelliğiyle seçersiniz:
- Mesh (
clusterMesh) — sıfır harici altyapı. Her düğüm bir küme bağlantı noktasını dinler ve eşlerine doğrudan bağlanır. Kurulacak fazladan hiçbir şey olmadan "kendiliğinden çalışması" gereken küçük kümeler için mükemmeldir. - Redis (
clusterRedis) — daha büyük dağıtımlar için, hâlihazırda çalıştırdığınız bir Redis sunucusunu Pub/Sub arka düzlemi olarak kullanır.
Mesh arka düzlemi (sıfır altyapı)
Mesh motoru, kümeleme yapmanın en hızlı yoludur. Her düğüme dinleyeceği bir ClusterPort ve eşlerinin host:port bilgisini verin, ardından kanal pub/sub'ının (ve Presence'ın) kümelenmesi için sgc protokolünü Attach edin:
uses
sgcWebSocket, sgcWebSocket_Protocols, sgcWebSocket_Cluster;
var
oServer: TsgcWebSocketServer;
oProtocol: TsgcWSPServer_sgc;
oCluster: TsgcWSCluster;
begin
oServer := TsgcWebSocketServer.Create(nil);
oServer.Port := 8080;
oProtocol := TsgcWSPServer_sgc.Create(nil);
oProtocol.Server := oServer;
oCluster := TsgcWSCluster.Create(nil);
oCluster.EngineType := clusterMesh; // zero-infrastructure backplane
oCluster.ClusterPort := 5410; // this node's mesh listener
oCluster.Peers.Add('192.168.1.101:5410'); // the other nodes
oCluster.Peers.Add('192.168.1.102:5410');
oCluster.Attach(oProtocol); // cluster this protocol's pub/sub
oCluster.Start;
oServer.Active := True;
end;
Değişikliğin tamamı bu. Bu düğüme bağlı bir istemci bir kanala Publish yapabilir ve diğer iki düğümdeki istemciler, sanki hepsi tek bir sunucudaymış gibi onu alır. Yapışkan oturumlara (sticky session) gerek yoktur.
Redis arka düzlemi
Daha büyük dağıtımlar için motoru clusterRedis olarak değiştirin ve Redis sunucunuza yönlendirin. Arka düzlemin üzerindeki her şey — kanallar, Presence, uygulama kodunuz — aynı kalır:
oCluster.EngineType := clusterRedis;
oCluster.RedisHost := '127.0.0.1';
oCluster.RedisPort := 6379;
oCluster.RedisPassword := ''; // optional
oCluster.RedisChannel := 'sgccluster'; // the Pub/Sub channel
oCluster.Attach(oProtocol);
oCluster.Start;
.NET
Yönetilen sgcWebSockets sürümü aynı bileşeni sunar. Kümeyi sunucunun sgc protokolüne ekleyin ve başlatın — bir düğümdeki yayın diğerlerindeki abonelere ulaşır:
var server = new TsgcWSServer { Port = 8080 };
var protocol = new TsgcWSPServer_sgc { Server = server };
var cluster = new TsgcWSCluster {
EngineType = ClusterEngineType.Mesh, // zero-infrastructure backplane
ClusterPort = 5414,
Protocol = protocol
};
cluster.Peers.Add("192.168.1.101:5414");
cluster.Peers.Add("192.168.1.102:5414");
cluster.Start();
server.Active = true;
Bu sürümde .NET sürümü mesh motoruyla gelir; Redis arka düzlemi Delphi / C++Builder sürümünde mevcuttur.
Küme genelinde Presence
Presence — "bu kanalda kim çevrimiçi" — bir sunucu yatay olarak ölçeklendiğinde en çok zarar gören özelliktir, çünkü her düğüm yalnızca kendi üyelerini görür. TsgcWSCluster bunu düzeltir: Presence protokolünü, sgc protokolünü eklediğiniz şekilde Attach edin; üye listesi tüm düğümler arasındaki birleşim hâline gelir. Katılma / ayrılma olayları küme genelinde yayılır ve devre dışı kalan bir düğümün üyeleri otomatik olarak temizlenir, böylece asla hayalet üye göstermezsiniz.
oCluster.Attach(oPresenceProtocol); // TsgcWSPServer_Presence
// GetMembers now returns the cluster-wide roster, not just this node's.
Kümenin ne zaman hazır olduğunu bilmek
Her küme, bağlantı durumunu açığa çıkarır; böylece yayına başlamadan önce arka düzlemi bekleyebilir veya bir gösterge panosunda düğüm sağlığını gösterebilirsiniz:
oCluster.OnPeerConnected := procedure(Sender: TObject; const aPeer: string)
begin
// a peer link came up
end;
if oCluster.Ready then // at least one peer connected (or no peers configured)
// ConnectedPeerCount tells you how many links are up
.NET'te aynı sinyaller OnPeerConnected / OnPeerDisconnected, ConnectedPeerCount özelliği ve IsReady'dir.
Kütüphanenin geri kalanıyla nasıl bir araya geldiği
Kümeleme, protokol kodunuzun altında yer alır, bu nedenle başka hiçbir şey değişmez. Hâlihazırda kullandığınız aynı Publish, kanal abonelikleri, QoS onayları ve Presence API'leri, artık her düğümde olmak üzere çalışmaya devam eder. Mesh motoru harici bir hizmete ihtiyaç duymaz, bu da iki veya üç düğümlü bir dağıtımı önemsiz kılar; Redis ise daha büyük ölçeklendiğinizde devreye girer. Kütüphaneyle birlikte iki düğümlü bir demo gelir (Delphi'de 02.WebSocket_Protocols\14.MultiNode_Clustering, .NET'te samples\ClusterDemo), böylece bir mesajın kendi makinenizde düğümler arasında geçişini izleyebilirsiniz.
Kullanılabilirlik
Çok düğümlü kümeleme bir Enterprise sürümü özelliğidir ve Delphi 7'den 13'e kadar (Win32/Win64, Linux64, macOS, Android ve iOS) ve yönetilen .NET sürümünde derlenir.
Etkin 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, geri bildirim ya da bunu dağıtımınıza entegre etme konusunda yardım mı? İletişime geçin — kodu yazan kişilerden bir yanıt alacaksınız.
