TsgcWSCluster — scale your sgcWebSockets servers across multiple nodes. A publish or Presence event on one node reaches subscribers connected to every other node, through a zero-infrastructure mesh backplane or a Redis Pub/Sub backplane.
Overview
Put two or more WebSocket servers behind a load balancer and a message published on one node still reaches subscribers connected to the others. TsgcWSCluster adds a pub-sub backplane between your nodes, so channels, broadcasts and Presence work cluster-wide. Drop the component next to your server, point the nodes at each other, and your existing Publish, channel and Presence code stays unchanged.
At a glance
Component class
TsgcWSCluster
Backplane
Mesh or Redis
Backplane engines
Mesh (zero-infrastructure) or Redis Pub/Sub
Platforms
Delphi 7–13 (Win32/Win64, Linux64, macOS, Android, iOS) and .NET
Frameworks
VCL, FireMonkey, Lazarus / FPC, .NET
Edition
Enterprise
Features
Two backplane engines. Published property EngineType: clusterMesh (no external infrastructure) or clusterRedis (Redis Pub/Sub).
Mesh, zero-infrastructure. Each node listens on ClusterPort and connects directly to the peers listed in Peers — nothing extra to install.
Redis Pub/Sub. Properties RedisHost, RedisPort and RedisChannel route messages through Redis for larger deployments.
Attach / Detach. Cluster the sgc protocol and the Presence protocol with one call each; Start and Stop control the backplane.
Cluster-wide Presence. The member roster becomes the union across all nodes; a node that drops has its members purged, so there are no ghost members.
Readiness signals. Property Ready, ConnectedPeerCount and events OnPeerConnected, OnPeerDisconnected and OnClusterMessage let you observe cluster health.
Loop prevention. Every message carries an origin node id so it is never echoed back to the node that produced it.
Drop-in. Your existing Publish and channel/subscription code is unchanged — clustering is transparent to the protocol layer.
Delphi 7–13 (Win32/Win64, Linux64, macOS, Android, iOS) and .NET
Edition
Enterprise
Main properties
The principal published / public properties used to configure and drive the component. Consult the online help for the full list.
EngineType
Selects the backplane engine: clusterMesh for the zero-infrastructure peer mesh, or clusterRedis for a Redis Pub/Sub backplane.
ClusterPort
TCP port this node listens on for the mesh backplane; peers connect to this port to exchange cluster messages.
Peers
List of the other nodes in host:port form that this node connects to when the mesh engine is active.
RedisHost
Hostname or IP address of the Redis server used as the backplane when EngineType is clusterRedis.
RedisPort
TCP port of the Redis server used as the backplane.
RedisChannel
Redis Pub/Sub channel name that all cluster nodes publish to and subscribe from.
Ready
Indicates whether the cluster backplane is up and this node is ready to relay messages to and from its peers.
ConnectedPeerCount
Number of peer nodes currently connected to this node through the backplane.
Main methods
The principal public methods exposed by the component.
Attach()
Clusters a protocol — the sgc protocol or the Presence protocol — so its publish/subscribe traffic is shared across all nodes.
Detach()
Stops clustering a previously attached protocol, returning it to single-node behaviour.
Start()
Starts the cluster backplane: opens the mesh listener and connects to the configured peers, or connects to Redis.
Stop()
Stops the cluster backplane, closing peer connections (or the Redis connection) while leaving the WebSocket server running.
Public events
The component exposes the following published events; consult the online help for full event-handler signatures.
OnPeerConnected
Fires when a peer node connects to this node through the cluster backplane.
OnPeerDisconnected
Fires when a peer node disconnects from this node; its Presence members are purged from the union roster.
OnClusterMessage
Fires when a message arrives from another node over the backplane, so the application can observe inter-node traffic.
Quick Start
Drop the component next to your TsgcWebSocketServer and the sgc protocol, point the nodes at each other and start it. A client on one node can Publish to a channel and clients on the other nodes receive it, with no sticky sessions.
About this scenario. Two or more nodes sit behind a load balancer. Each node runs a TsgcWebSocketServer with the sgc protocol attached to a TsgcWSCluster using the mesh backplane. Your existing Publish, channel and Presence code stays unchanged.
Delphi (VCL / FireMonkey)
uses
sgcWebSocket, sgcWebSocket_Protocols, sgcWebSocket_Cluster;
var
Server: TsgcWebSocketServer;
Protocol: TsgcWSPServer_sgc;
Cluster: TsgcWSCluster;
begin
Server := TsgcWebSocketServer.Create(nil);
Server.Port := 8080;
Protocol := TsgcWSPServer_sgc.Create(nil);
Protocol.Server := Server;
Cluster := TsgcWSCluster.Create(nil);
Cluster.EngineType := clusterMesh; // zero-infrastructure backplane
Cluster.ClusterPort := 5410; // this node's mesh listener
Cluster.Peers.Add('192.168.1.101:5410'); // the other nodes
Cluster.Peers.Add('192.168.1.102:5410');
Cluster.Attach(Protocol); // cluster this protocol's pub/sub
Cluster.Start;
Server.Active := True;
end;
C++ Builder
#include "sgcWebSocket.hpp"
#include "sgcWebSocket_Protocols.hpp"
#include "sgcWebSocket_Cluster.hpp"
TsgcWebSocketServer *Server = new TsgcWebSocketServer(NULL);
Server->Port = 8080;
TsgcWSPServer_sgc *Protocol = new TsgcWSPServer_sgc(NULL);
Protocol->Server = Server;
TsgcWSCluster *Cluster = new TsgcWSCluster(NULL);
Cluster->EngineType = clusterMesh; // zero-infrastructure backplane
Cluster->ClusterPort = 5410; // this node's mesh listener
Cluster->Peers->Add("192.168.1.101:5410"); // the other nodes
Cluster->Peers->Add("192.168.1.102:5410");
Cluster->Attach(Protocol); // cluster this protocol's pub/sub
Cluster->Start();
Server->Active = true;
.NET (C#)
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;
Common scenarios
The following scenarios show the configuration and method calls needed to drive the component through a specific real-world flow.
1 · Redis Pub/Sub backplane
For larger deployments, switch the engine from mesh to Redis. Every node publishes to and subscribes from the same Redis channel, so you do not need to maintain a peer list.
Attach the Presence protocol to the cluster as well. The member roster becomes the union across all nodes, and when a node drops its members are purged so there are no ghost members.
Delphi (VCL / FireMonkey)
Cluster.Attach(Protocol); // the sgc protocol
Cluster.Attach(Presence); // the Presence protocol
Cluster.Start;
// Presence.Members now reflects every node in the cluster
C++ Builder
Cluster->Attach(Protocol); // the sgc protocol
Cluster->Attach(Presence); // the Presence protocol
Cluster->Start();
// Presence->Members now reflects every node in the cluster
.NET (C#)
cluster.Attach(protocol); // the sgc protocol
cluster.Attach(presence); // the Presence protocol
cluster.Start();
// presence.Members now reflects every node in the cluster
3 · Readiness signals
Watch the backplane come up and observe peer connections through the readiness property and events.
Delphi (VCL / FireMonkey)
procedure OnPeerConnected(Sender: TObject; const aPeer: string);
begin// a peer node joined the cluster
ShowStatus('Peers: ' + IntToStr(Cluster.ConnectedPeerCount));
end;
if Cluster.Ready then// the backplane is up and relaying messages;
C++ Builder
void__fastcall OnPeerConnected(TObject *Sender, const String aPeer)
{
// a peer node joined the cluster
ShowStatus("Peers: " + IntToStr(Cluster->ConnectedPeerCount));
}
if (Cluster->Ready)
{
// the backplane is up and relaying messages
}
.NET (C#)
cluster.OnPeerConnected += (sender, peer) =>
{
// a peer node joined the cluster
ShowStatus($"Peers: {cluster.ConnectedPeerCount}");
};
if (cluster.Ready)
{
// the backplane is up and relaying messages
}
Sources used to build this document
Every external claim links back to a primary source. The online-help references decode the canonical deep-link the company maintains for this component.
Document scope. This document covers the publicly-documented surface of the Multi-node Clustering component (TsgcWSCluster) shipped with sgcWebSockets. For full property, method and event reference consult the online help linked above.