标准答案
- 每类任务有独立队列和配额,调度器按权重选择下一类。
- 任务等待过久时提高有效优先级,或保留低优先级执行槽。
- 重试任务要限制次数和占用,失败消息不能无限挤占新任务。
题目解析
优先级队列首先是业务资源分配规则。多个队列可以使用加权轮询、配额或保底执行槽,高优任务有更快的服务机会,但不能无限占满 CPU、连接和下游配额。
等待时间老化可以让长期等待的低优任务逐步提升优先级;失败重试要单独限制,否则一个有问题的高优任务会持续挤压新任务。
客户端不能直接决定任意高优级别,优先级应由服务端按身份、业务类型和可信规则计算,并监控每类任务的最老等待时间和执行比例。
代码示例
调度伪代码:
TypeScript
for (const queue of weightedQueues) {
if (queue.hasReadyTask()) return queue.take()
}
// periodically promote tasks whose wait time exceeds the threshold常见误区
- 误区:永远只取最高优先级。改正:使用权重、老化或低优先级保底,防止饥饿。
- 误区:没有老化或保底配额。改正:定义最大等待时间和最低服务比例,并对过期任务做明确处理。
- 误区:优先级字段由不可信客户端直接决定。改正:服务端根据可信业务规则计算优先级,并限制可用等级。