open-webrtc-toolkit / owt-server

General server (streaming/conference/transcoding/anayltics) for OWT. (A.k.a. MediaServer)
https://01.org/open-webrtc-toolkit
Apache License 2.0
1.13k stars 368 forks source link

add weightRobin for strategy.js #1382

Closed keycodingyfq closed 1 month ago

keycodingyfq commented 1 month ago

below was my test case

var weightRobin = function() {
    let servers = [];
    this.allocate = function(workers, candidates, on_ok, on_error) {
        for (let i in candidates) {
            let id = candidates[i];
            let index = servers.findIndex(item => { return item.name == id });
            if (index == -1) {
                servers.push({ "name": id, "cur_weight": 0 });
            }
            index = servers.findIndex(item => { return item.name == id });
            servers[index].weight = parseInt((1 - workers[id].load) * 100);
        }

        for (let i = servers.length - 1; i >= 0; i--) {
            if (candidates.indexOf(servers[i].name) == -1) {
                servers.splice(i, 1);
            }
        }

        let index = -1;
        let total = 0;
        let size = servers.length;
        for (let i = 0; i < size; i++) {
            servers[i].cur_weight += servers[i].weight;
            total += servers[i].weight;

            if (index == -1 || servers[index].cur_weight < servers[i].cur_weight) {
                index = i;
            }
        }

        servers[index].cur_weight -= total;
        on_ok(servers[index].name);
    };
}

var t = new weightRobin();
var candidates = [];
var workers = {};
for (let i = 0; i < 10; i++) {
    workers[i] = { id: i, load: 0 }
    candidates.push(i);
}

setInterval(() => {
    t.allocate(workers, candidates, (id) => {
        console.log(workers[id]);
    });
}, 1000);

var fulload = false;
setInterval(() => {
    if (!fulload) {
        fulload = true;
        console.log("let work.0 full load");
        workers[0].load = 0.85;
    } else {
        fulload = false;
        console.log("let work.0 load=0");
        workers[0].load = 0;
    }
}, 10000);