并发控制与排队
并发控制的核心是限制同时在途的请求数量:用信号量把并发压在上游能承受的范围内,超出的任务进队列等待,队列按公平策略分配且设最长等待时间。高峰期宁可让请求排队,也不要用瞬时爆发把上游打垮,因为上游挂掉时所有请求都会失败。
基本信息
| 容量 | 按上游限额设定在途上限,并留出余量 |
|---|---|
| 队列与公平 | 通常 FIFO,叠加租户配额防止单租户占满 |
| 排队超时 | 超过等待上限即移出队列并返回繁忙提示 |
| 背压 | 队列长度超阈值时暂停承接非关键任务 |
| 观测 | 排队长度、等待时长 P95、超时率、在途数 |
典型使用场景
- 对接有速率上限的上游:并发数贴近限额但不越界
- 多租户平台:单租户并发设上限,保证整体公平
- 批量任务与实时请求共存:实时请求优先,批量任务在队列尾部
- 高峰保护:队列过长时先停非关键增强功能
- 容量评估:用等待时长 P95 判断是否需要扩容或调高并发
并发控制示例
并发控制示例
semaphore = 20 # 在途上限,按上游容量定并留余量
queue: FIFO + 租户配额 # 单租户并发不超过 5
排队超时: 30s 后返回繁忙提示,不让用户无限等待
背压: 排队长度超过 200 时暂停承接非关键任务
超时与取消语义:
排队超时 → 移出队列并返回提示
在途超时 → 按幂等键查询实际结果,不盲目重发
取消动作 → 先停新任务,再等在途任务自然结束参数与取值依据
| 参数 | 取值依据 | 调整信号 |
|---|---|---|
| 在途上限 | 上游限流值与实测容量 | 上游 429 增多则下调 |
| 单租户并发 | 服务等级与租户数量 | 某租户占用过高则收紧 |
| 排队超时 | 用户可接受等待时间 | 超时率升高则评估扩容 |
| 背压阈值 | 队列内存与下游处理速度 | 积压持续则提前触发 |
并发上限与上游限流要一起设计:本地并发 20 而上游每秒只放 5 个请求,多出来的部分只会变成 429。