SetNet.LoadBalancer
1.2.0
dotnet add package SetNet.LoadBalancer --version 1.2.0
NuGet\Install-Package SetNet.LoadBalancer -Version 1.2.0
<PackageReference Include="SetNet.LoadBalancer" Version="1.2.0" />
<PackageVersion Include="SetNet.LoadBalancer" Version="1.2.0" />
<PackageReference Include="SetNet.LoadBalancer" />
paket add SetNet.LoadBalancer --version 1.2.0
#r "nuget: SetNet.LoadBalancer, 1.2.0"
#:package SetNet.LoadBalancer@1.2.0
#addin nuget:?package=SetNet.LoadBalancer&version=1.2.0
#tool nuget:?package=SetNet.LoadBalancer&version=1.2.0
<p align="center"> <img src="https://raw.githubusercontent.com/Povstalez/SetNet/master/assets/icon.png" alt="SetNet" width="96"> </p>
SetNet.LoadBalancer
Least-loaded node selection for SetNet clusters.
A well-known entry node keeps a registry of game nodes with their reported load and capacity; a client asks for the emptiest node with room and connects there. It's the capacity-driven counterpart to SetNet.Sharding (which routes by key): use the balancer when any node will do and you just want the least busy one. Added by composition — no base class.
Install
dotnet add package SetNet
dotnet add package SetNet.LoadBalancer
Usage
Call LoadBalancerRuntime.Enable() once at startup on both ends.
// entry-node server — feed it node loads (from SetNet.Cluster gossip, an orchestrator, or health pings)
LoadBalancerRuntime.Enable();
var lb = server.UseLoadBalancer();
lb.UpdateNode(new LbNode("eu-1", "eu1.game.example", 5000, load: 0, capacity: 500));
lb.UpdateNode(new LbNode("eu-2", "eu2.game.example", 5000, load: 0, capacity: 500));
// as loads change:
lb.ReportLoad("eu-1", currentPlayers);
// client — pick the emptiest node, then connect there
LoadBalancerRuntime.Enable();
var lb = entryClient.UseLoadBalancer();
LbNode node = await lb.PickAsync();
var gameClient = new GameClient(new Configuration { Host = node.Host, Port = node.Port /* ... */ });
await gameClient.ConnectAsync();
API
Server: server.UseLoadBalancer() → LoadBalancerServer — UpdateNode(LbNode), ReportLoad(nodeId, load), RemoveNode(nodeId), Pick(), Nodes.
Client: client.UseLoadBalancer() → LoadBalancerClient — PickAsync() (throws when all nodes are full).
LoadBalancerRuntime.Enable() — one-time bootstrap.
Notes
- Rides the unified SetNet.Protocol messaging layer on the
Channels.LoadBalancerchannel (all modules share one envelope wire type,65447) — no per-module wire ids to reserve. Serializer-agnostic: the control protocol is hand-framedbyte[], your payloads use yourSetNetSerializer. - You feed the registry. This package doesn't gossip or health-check on its own — push node loads via
UpdateNode/ReportLoad, typically fromSetNet.Clusterbroadcasts or your orchestrator.RemoveNodea drained/dead node. - Selection: the node with the lowest load/capacity ratio that isn't full. Uncapped nodes (capacity 0) are ranked by raw load and never reported full.
- Balancer vs Sharding: balancer picks by capacity (any node will do); Sharding picks by key (a room/region must always land on the same node). Use both — balance new sessions, shard keyed ones.
Documentation & source
- 🐙 https://github.com/Povstalez/SetNet — full catalog in docs/MODULES.md
License
MIT
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
| .NET Core | netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.1 is compatible. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.1
- SetNet (>= 1.2.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 1.2.0 | 145 | 8/5/2026 |