namespace RemoteExec.Client.LoadBalancingStrategies;
///
/// A load balancing strategy that selects servers based on CPU usage, active tasks, and backlog.
///
internal class ResourceAwareStrategy : ILoadBalancingStrategy
{
///
public ServerConnection? SelectServer(IEnumerable availableServers)
{
return availableServers.MinBy(s =>
{
if (s.Metrics == null)
{
return double.MaxValue;
}
double cpuScore = s.Metrics.CpuUsage;
double activeTaskScore = s.Metrics.ActiveTasks * 10;
double backlogScore = s.TaskChannel.Reader.Count * 50;
return cpuScore + activeTaskScore + backlogScore;
});
}
}