75 lines
2.0 KiB
Go
75 lines
2.0 KiB
Go
package scheduler
|
|
|
|
import "context"
|
|
|
|
// Scheduler 三层编排器——串联 TaskGenerator → ConstraintFilter → PolicyEngine。
|
|
// 骨架阶段:只定义接口和编排流程,不直接修改 processor 包。
|
|
// 后续阶段:processor 包的 JobRuntime 将通过此 Scheduler 替代直接调用 Dispatcher。
|
|
type Scheduler struct {
|
|
generator TaskGenerator
|
|
filter ConstraintFilter
|
|
policy PolicyEngine
|
|
}
|
|
|
|
func NewScheduler(g TaskGenerator, f ConstraintFilter, p PolicyEngine) *Scheduler {
|
|
return &Scheduler{
|
|
generator: g,
|
|
filter: f,
|
|
policy: p,
|
|
}
|
|
}
|
|
|
|
// ScheduleAll 对多个 Job 执行三层调度,合并结果后排序。
|
|
// 用于全局调度场景(如收到 MachineTaskComplete 信号后重新评估所有 Job)。
|
|
func (s *Scheduler) ScheduleAll(ctx context.Context, jobs []JobView, state SystemState) []CandidateTask {
|
|
var allCandidates []CandidateTask
|
|
for _, job := range jobs {
|
|
candidates := s.generator.Generate(job)
|
|
allCandidates = append(allCandidates, candidates...)
|
|
}
|
|
|
|
if len(allCandidates) == 0 {
|
|
return nil
|
|
}
|
|
|
|
feasible := s.filter.Filter(ctx, allCandidates, state)
|
|
|
|
if len(feasible) == 0 {
|
|
return nil
|
|
}
|
|
|
|
return s.policy.Rank(feasible, state)
|
|
}
|
|
|
|
// DefaultScheduler 创建默认配置的 Scheduler。
|
|
// 使用 RecipeTaskGenerator + 所有内置约束 + 默认优先级策略。
|
|
func DefaultScheduler() *Scheduler {
|
|
generator := NewRecipeTaskGenerator()
|
|
filter := NewCompositeFilter(
|
|
NewMachineDisabledConstraint(),
|
|
NewMachineBusyConstraint(),
|
|
NewMachineEmptyConstraint(),
|
|
NewTempSlotFullConstraint(),
|
|
NewOrderPausedConstraint(),
|
|
NewOrderPausingConstraint(),
|
|
NewOrderCancellingConstraint(),
|
|
NewJobSuspendedConstraint(),
|
|
NewExchangePairConstraint(),
|
|
NewReplenishConstraint(),
|
|
NewWasteReadyConstraint(),
|
|
)
|
|
policy := NewPriorityPolicy(
|
|
UnloadFirstRule,
|
|
SamplingFirstRule,
|
|
LaterStageUnloadFirstRule,
|
|
IdleMachineLoadFirstRule,
|
|
LaterStageLoadFirstRule,
|
|
ExchangeFirstRule,
|
|
BasePriorityRule,
|
|
JobIDSmallerFirstRule,
|
|
SameMachineRule,
|
|
)
|
|
|
|
return NewScheduler(generator, filter, policy)
|
|
}
|