Closed keycodingyfq closed 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);
below was my test case