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