先理解
刚接触这个知识点
补齐先备概念,读原理与反例,再用自己的话解释为什么。
从核心原理开始 →理解 → 实现 → 排错 → 取舍
考察多租户排队、公平调度、背压与多维配额。
知识内容核对 2026-10-03 · 原题来源核对 2026-10-02
按当前基础选择起点,也可以依次深入。遇到不熟悉的概念,先回到核心原理;完成后用知识练习检查理解。
LEARN · PRACTICE · REFLECT
先沿着原理、问答和迁移案例阅读。需要检查理解时,再切换巩固练习或展开个人记录。
核心知识 · 多租户公平调度、资源配额与背压
先备概念:排队与并发、租户资源隔离、任务可恢复步骤
总并发限制保护系统容量,租户调度保护资源分配,两者缺一不可。公平要按实际耗用和等待衡量,不能把请求条数或全局平均延迟当成隔离保证。
提交一万条任务可以很快,却可能让数据库、模型和工具进入持续过载。入口控制待处理数量、任务大小和租户预算;执行层限制模型并发、Token 速率、工具连接和内存。请求数相同不代表成本相同,一个长研究任务可能耗用上百次调用。
它只限制同时运行多少个,如果所有位置都被大租户占据,小租户仍需排在大量旧任务之后。采用租户轮询、带权或按估计成本调度,再在执行层设租户并发和全局资源上限。长任务在可恢复步骤边界重新排队或使用隔离资源池,不能声称能随时安全抢占远端写操作。
优先级与权重按服务目标明确,避免低优先级永久饿死;使用等待增权、最低份额或最大等待目标,但容量不足时需要拒绝或让用户选择。Amazon SQS fair queues 用租户标识改善 noisy neighbor 的等待分配,官方明确它不限制每租户消费速率,也不提供标准队列消息顺序保证,因此不能替代应用配额。
模型限流、工具故障或索引变慢时减少领取,有限退避而非无限重试。不同瓶颈设独立额度,防一个服务失败拖住所有 Worker。混合负载验收同时看小租户等待 P95、队列年龄、大租户吞吐、实际费用和饥饿;全局平均改善可能仅因大租户快任务增加,不能证明隔离。
入口做租户级准入和配额,队列按租户公平调度,Worker 受全局及下游容量限制。仅限制请求数不够,还要控制并发、Token、工具调用、预计费用和最长等待。长任务按可恢复步骤让出执行资源,取消与过期任务及时移除。用混合负载测小租户等待时间和大租户吞吐,避免只看全局平均延迟。
提交接口快速返回任务 ID 不代表可以无限积压。为租户设置待处理数量、任务大小和预算上限,超限时返回可理解的重试或排队信息。执行层按模型与工具的实际容量限制并发,不能因为队列能装下十万条就启动十万个协程。
可采用租户轮询、带权轮询或基于成本的调度,权重由服务等级确定。长任务拆成可恢复步骤,步骤完成后再排队,防止一个运行长期霸占 Worker。调度要避免饥饿并考虑截止时间,但高优先级不应无限抢占其他租户。预估成本不准确时按实际用量结算并调整。
模型供应商限流、向量库慢或工具网关故障时减少取任务速度,避免队列消费者持续制造失败和重试风暴。为不同资源设置独立额度与熔断,取消时清理未开始任务并停止新增动作。已发出的写请求照常进入核对流程,不能只从队列删除就认为完全取消。
压测同时加入一个大租户批量任务、多个小租户交互任务和下游限流。观察每租户等待 P95、队列年龄、完成率、实际费用和饥饿情况。逐步升压直到出现瓶颈,检查系统是否拒绝或降速而不是内存耗尽。全局均值改善不能掩盖某个租户完全无法服务。
沿着问题的前提和约束继续向下读。先理解参考解答,再尝试收起答案,用自己的话解释因果和取舍。
第 1 层只设置全局 Semaphore 为什么不够?
从保护总容量深入到租户资源分配。
它限制总同时运行数,不决定哪个租户拿到名额。FIFO 队列里大租户的一万条仍在小租户前面,长任务还可能持续占满槽位。加入租户公平领取、租户并发和不同资源额度;多进程系统的全局限额也需共享协调,进程内 Semaphore 不是全服务配额。
沿着这个回答继续深入
第 2 层加每租户 Semaphore 后,为什么小租户还可能等很久?
父问增租户限额后,队列领取顺序仍可造成头部阻塞。
若全局 FIFO 先出大量被租户限额挡住的任务,消费者可能拿着这些任务占槽或反复空转,尚未轮到小租户。先公平选可运行租户,再领取其任务并获取资源;失败领取及时释放。队列调度和执行限额要配合,不能只叠两个锁。
沿着这个回答继续深入
第 3 层公平按条数轮询,大租户每条要一小时,小租户只要十秒,还公平吗?
修复队列头阻塞后,任务成本差异要求重新定义公平单位。
条数公平不等于资源公平。按估计执行成本或时间片分配,长任务在安全步骤边界让出,并用实际成本修正后续额度。无法安全抢占的长步骤使用独立池或更严格并发;评估小租户等待和资源占比,而不是仅比较完成条数。
第 1 层Token 成本无法提前准确估计怎么办?
公平请求分配还需考虑未知且不等成本。
按保守上界或估计成本预留,限制单步最大输出和工具次数,结束按真实用量结算并调整以后估计。超出预留需追加额度或停止,未知用量留待对账;调度可先按估计成本公平领取,实际差额影响后续份额。只按任务数无法约束费用。
第 1 层优先级队列会不会让低优先级饿死?
优先级设计要处理饥饿与容量不可满足的条件。
会,持续高优先级流量可能永远抢走所有资源。设置最低份额、等待增权或分池容量,限制高优先级准入,并定义超载时的拒绝策略。不可同时承诺无限高优先级吞吐和所有低优先级等待有界;目标要基于容量和测试。
先找出改变的条件,再判断原方案中哪些前提仍成立。下面的案例是教学推演,便于将原理迁移到新问题。
改变的条件:调度容量不变,但实际服务能力下降
延伸问题:增加 Worker 就能消化积压吗?
可能只增加并发失败与重试洪峰。识别模型限流信号,降低领取和该资源并发,退避带抖动,隔离不依赖模型的工作。入口提示排队或拒绝超出预算的任务,持续监测队列年龄;扩容要先确认瓶颈服务可增加额度。
保持不变的原理:吞吐受最窄资源约束,背压需按实际下游容量而非 Worker 数。
改变的条件:同租户内部也有不同延迟目标
延伸问题:每租户轮询就能保障交互等待吗?
不能保证租户内部长任务不挡短任务。可按任务类型分池或加租户内优先级,并为批量保留最低份额。长任务按可恢复步骤让出,限制一轮执行成本;不能拆出一万个高优先级子任务绕过原批量配额。
保持不变的原理:公平的资源单位应匹配任务成本与服务目标,层级调度仍需准入约束。
依据公开技术资料设计;参考资料支持技术机制,场景与评分标准为本站设计,不代表某公司面试原题。 新增问答与迁移案例用于原理讲解,来源核查与案例运行验证分别记录。
读完后可以对照这些标准解释原理、边界和取舍。掌握程度由你自评;需要进一步验证时,再完成下方小任务。
给大租户 1000 个长任务、小租户 5 个短任务设计调度与观测指标。