# scheduling_framework **Repository Path**: yzc1114/scheduling_framework ## Basic Information - **Project Name**: scheduling_framework - **Description**: scheduling framework - **Primary Language**: Rust - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-12-02 - **Last Updated**: 2024-12-10 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Fleet-core Scheduler Framework ## 介绍 支持多种调度插件协作运行的调度框架。 ## 框架 每次调度分为入队周期、调度周期、绑定周期。 入队周期与调度周期串行同步执行,而绑定周期异步并行执行。 ![调度框架流程](./image/scheduler_framework.png) ## 入队周期 ### PreEnqueue - 任务入队前的预处理 - 这些插件在将Cargo被添加到内部活动队列之前被调用,在此队列中Cargo被标记为准备好进行调度。 - 只有当所有PreEnqueue插件返回Success时,Cargo才允许进入待调度队列。 ## 调度周期 ### PreFilter - 任务过滤前的预处理 - 这些插件用于预处理Cargo的相关信息,或者检查集群或Cargo必须满足的某些条件。 如果PreFilter插件返回错误,则调度周期将终止。 ### Filter - 任务过滤 - 这些插件用于过滤出不能运行该Cargo的节点。对于每个节点,调度器将按照其配置顺序调用这些过滤插件。 - 如果任何过滤插件将节点标记为不可行,则不会为该节点调用剩下的过滤插件。 - 节点可以被同时进行评估。 ### PostFilter - 任务过滤后的处理 - 这些插件在Filter阶段后调用,但仅在该Cargo没有可行的节点时调用。插件按其配置的顺序调用。 - 如果任何PostFilter插件标记节点为"Schedulable",则其余的插件不会调用。 ### PreScore - 任务评分前的预处理 - 这些插件用于执行“前置评分(pre-scoring)”工作,即生成一个可共享状态供Score插件使用。如果PreScore插件返回错误,则调度周期将终止。 ### Score - 任务评分 - 这些插件用于对通过过滤阶段的节点进行排序。调度器将为每个节点调用每个评分插件。将有一个定义明确的整数范围,代表最小和最大分数。 - 在标准化评分阶段之后,调度器将根据配置的插件权重合并所有插件的节点分数。 ### NormalizeScore - 任务评分标准化 - 这些插件用于标准化评分插件的输出。调度器将为每个节点调用每个标准化评分插件。 ### Reserve - 任务预留 - 实现了Reserve接口的插件,拥有两个方法,即Reserve和Unreserve,他们分别支持两个名为Reserve和Unreserve的信息传递性质的调度阶段。维护运行时状态的插件(又称"有状态插件")应该使用这两个阶段,以便在节点上的资源被保留和解除保留给特定的Cargo时,得到调度器的通知。 - Reserve阶段发生在调度器实际将一个Cargo绑定到其指定节点之前。它的存在是为了防止在调度器等待绑定成功时发生竞争情况。每个Reserve插件的Reserve方法可能成功,也可能失败;如果一个Reserve方法调用失败,后面的插件就不会被执行,Reserve阶段被认为失败。如果所有插件的Reserve方法都成功了,Reserve阶段就被认为是成功的,剩下的调度周期和绑定周期就会被执行。 - 如果Reserve阶段或后续阶段失败了,则触发Unreserve阶段。发生这种情况时,所有Reserve插件的Unreserve方法将按照Reserve方法调用的相反顺序执行。这个阶段的存在是为了清理与保留的Cargo相关的状态。 ## 绑定周期 ### PreBind - 任务绑定前的预处理 - 这些插件用于执行Cargo绑定前所需的所有工作。 - 如果任何PreBind插件返回错误,则Cargo将被拒绝并且退回到调度队列中。 ### PostBind - 任务绑定后的处理 - 这是个信息传递性质的接口。 PostBind插件在Cargo成功绑定后被调用。这是绑定周期的结尾,可用于清理相关的资源。