进程调度
2024年12月13日
一、Round-Robin 轮询调度
Round-Robin
(轮询)调度算法: 在 Cluster
模式下, 主进程通过 Round-Robin
(轮询)调度算法实现将请求分发到不同的子进程中,实现负载均衡。Round-Robin
调度算法 是一种 公平分配任务 的调度方法,它按照顺序(轮询)将任务分配给可用资源,确保每个资源接收到的任务数量大致相等,不会出现资源长期空闲或过载的情况, 每个资源按顺序被依次调度,不偏向任何一方, 适用于任务轻量、处理时间较短、资源处理能力相对均衡的场景。Round-Robin
调度算法 的核心原理为: 维护一个资源列表(例如服务器、任务队列等),并从头到尾顺序分配任务。当资源分配到最后一个时,调度器会回到列表的第一个资源,继续分配任务。调度器通常需要维护一个索引(或指针),记录上一次分配到哪个资源,下次调度时从下一个资源开始。简单来说: 定义一个资源列表,使用一个指针记录当前调度到哪个资源,每次分配任务时,更新指针,循环访问资源列表。
class RoundRobinScheduler {
constructor(servers) {
this.servers = servers; // 资源列表,如服务器
this.currentIndex = -1; // 当前分配的索引位置
}
// 获取下一个资源
getNextServer() {
// 更新索引,轮询选择下一个服务器
this.currentIndex = (this.currentIndex + 1) % this.servers.length;
return this.servers[this.currentIndex];
}
// 分配任务
assignTasks(tasks) {
tasks.forEach((task, index) => {
const server = this.getNextServer(); // 获取下一个服务器
console.log(`任务 ${index + 1} 分配给服务器: ${server}`);
});
}
}
// 示例使用
const servers = ['Server-A', 'Server-B', 'Server-C']; // 服务器列表
const tasks = [1, 2, 3, 4, 5, 6, 7]; // 待分配的任务
const scheduler = new RoundRobinScheduler(servers);
scheduler.assignTasks(tasks);
// 输出结果:
任务 1 分配给服务器: Server-A
任务 2 分配给服务器: Server-B
任务 3 分配给服务器: Server-C
任务 4 分配给服务器: Server-A
任务 5 分配给服务器: Server-B
任务 6 分配给服务器: Server-C
任务 7 分配给服务器: Server-A
Round-Robin
调度算法 算法逻辑清晰,代码量少。每个资源都会得到相同的任务分配机会。不需要复杂的数据结构,适合轻量级场景。但是, 如果不同资源的处理能力差异较大,Round-Robin
可能导致高负载的资源处理不过来,而低负载的资源处于空闲状态。如果任务的大小或耗时不均匀,轮询分配可能导致任务处理效率低。当资源数量动态变化时(如新增或移除服务器),需要重新初始化资源列表,影响性能。
在实际应用中,Round-Robin
非常适合资源能力相当、任务轻量的场景。如果任务或资源存在差异,可以引入 权重轮询(Weighted Round-Robin
) 或其他更复杂的调度算法。