标准答案

  1. 每类任务有独立队列和配额,调度器按权重选择下一类。
  2. 任务等待过久时提高有效优先级,或保留低优先级执行槽。
  3. 重试任务要限制次数和占用,失败消息不能无限挤占新任务。

题目解析

优先级队列首先是业务资源分配规则。多个队列可以使用加权轮询、配额或保底执行槽,高优任务有更快的服务机会,但不能无限占满 CPU、连接和下游配额。

等待时间老化可以让长期等待的低优任务逐步提升优先级;失败重试要单独限制,否则一个有问题的高优任务会持续挤压新任务。

客户端不能直接决定任意高优级别,优先级应由服务端按身份、业务类型和可信规则计算,并监控每类任务的最老等待时间和执行比例。

代码示例

调度伪代码:

TypeScript
for (const queue of weightedQueues) {
  if (queue.hasReadyTask()) return queue.take()
}
// periodically promote tasks whose wait time exceeds the threshold

常见误区

  • 误区:永远只取最高优先级。改正:使用权重、老化或低优先级保底,防止饥饿。
  • 误区:没有老化或保底配额。改正:定义最大等待时间和最低服务比例,并对过期任务做明确处理。
  • 误区:优先级字段由不可信客户端直接决定。改正:服务端根据可信业务规则计算优先级,并限制可用等级。

作者信息