mirror of
https://github.com/livekit/livekit.git
synced 2026-04-01 04:25:39 +00:00
* Add sort by option to node selector Allow the final decision of a selected node to be based on different sorting options rather than just random. Add a `sysload`, `cpuload`, `rooms`, `clients`, `tracks`, and `bytespersec` sorting options to select the appropriate room when multiple are suitable for the chosen selector. Add tests for sysload sort_by option Closes: #598 * NodeSelector: rename "random" selector to "any" Since the selector introduces limits but the final selection is now based on the sort by value, the random selector name does not make sense. Rename this selector to "any" to accurately reflect that it will select any available no with no additional selection limits. Allow the old setting "random" to point to the new selector name, but print a deprecation warning message.
40 lines
939 B
Go
40 lines
939 B
Go
package selector
|
|
|
|
import (
|
|
"github.com/livekit/protocol/livekit"
|
|
)
|
|
|
|
// SystemLoadSelector eliminates nodes that surpass has a per-cpu node higher than SysloadLimit
|
|
// then selects a node from nodes that are not overloaded
|
|
type SystemLoadSelector struct {
|
|
SysloadLimit float32
|
|
SortBy string
|
|
}
|
|
|
|
func (s *SystemLoadSelector) filterNodes(nodes []*livekit.Node) ([]*livekit.Node, error) {
|
|
nodes = GetAvailableNodes(nodes)
|
|
if len(nodes) == 0 {
|
|
return nil, ErrNoAvailableNodes
|
|
}
|
|
|
|
nodesLowLoad := make([]*livekit.Node, 0)
|
|
for _, node := range nodes {
|
|
if GetNodeSysload(node) < s.SysloadLimit {
|
|
nodesLowLoad = append(nodesLowLoad, node)
|
|
}
|
|
}
|
|
if len(nodesLowLoad) > 0 {
|
|
nodes = nodesLowLoad
|
|
}
|
|
return nodes, nil
|
|
}
|
|
|
|
func (s *SystemLoadSelector) SelectNode(nodes []*livekit.Node) (*livekit.Node, error) {
|
|
nodes, err := s.filterNodes(nodes)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return SelectSortedNode(nodes, s.SortBy)
|
|
}
|