一、队列如何建模
1.1 层级队列结构
把队列按组织与业务层层嵌套,父队列管总份额,子队列在其内再分。结构清晰,资源走向才看得明。层级不宜过深,过深反而难维护。三层左右通常够用,再多就成负担。嵌套还要配上限,防止某分支无限细分把管理成本推高,也防止份额被切得太碎。父队列总份额要留余量,给突发大任务预留调剂空间。
1.2 权重分配
同一层队列间按权重分算力,权重反映业务重要度。权重不是越大越好,要结合实际用量设。设太高长期占着不用,是浪费;设太低关键时抢不到,是失守。权重随业务节奏定期复盘调整。权重变更要走审批,随意改会破坏可预期性,也让排期方无所适从。权重变更要可灰度,全量切换易引发短暂排期混乱。
二、优先级机制
2.1 抢占与让出
高优先级任务到来,可临时占用低优先级的空闲算力,这叫抢占。被抢占方要能温和让出,不能丢进度。让出机制健全,抢占才安全。没有让出保障的抢占,会制造更多混乱。让出还要保进度可续,被中断的任务恢复后能接着跑,而不是从头再来,否则抢占代价过高。抢占要有频率限制,高频抢占会让低优任务长期饿死。
2.2 抢占回收
高优先级任务结束后,被占的算力要还给原主,而非一直空着。回收要及时,否则原队列长期饿着。回收策略配上限,防止频繁来回拉扯。回收干净,池子才始终流动起来。回收触发的时机也要稳,抖动式回收会让低优任务体验忽快忽慢,难以预测。回收对上层透明,任务不应感知到被让出又收回。
三、配额治理
3.1 保底份额
每个队列应有最低保底,确保即使忙时也有口粮。保底之和不超过总量,留少量公共池调剂。保底写进配置,变动要审批。保底到位,长尾业务才不会被大任务彻底挤没。保底还要可观测,当前占用离保底多远一眼可见,便于提前发现某队列长期吃不满。保底占用要可预测,便于提前发现某队列长期吃不满。
3.2 借用与归还
公共池的算力可被临时借走,但要有归还时限。借而不还,保底就失去意义。借用记录留痕,超时自动收回。借用机制让闲时资源活起来,又不破坏保底秩序。借用还要设速率,短时间大量借入会瞬间抽干公共池,反伤其他队列,需配合缓慢放量。借用速率要限流,瞬时抽干公共池会反伤其他队列。限流还能保护借用秩序,防止临时借入演变成长期占用。
结尾
多队列编排,结构是骨架,机制是肌肉,配额是底线。层级队列定结构,抢占让出定先后,保底借用定秩序。三者配齐,算力池里重要任务先走、长尾不饿死,整体既高效又稳当可控。池子经得起忙时与突发,才是调度真正到位。