Ticketing
文档

B · 繁忙 (Busy)

结构refresh

获取请求(A)到达了,但该 key 的 等待队列已达到服务器上限(max_waiters,默认 16,384),因而无法排队。这只是 没有拿到锁,并不意味着请求本身有问题。

owner 是把请求中携带的值原样回传的关联标识 —— 可以准确知道是哪一次获取尝试被拒绝 (响应匹配规则)。

客户端处理

不要立即失败。 只要 wait 预算还有剩余,就应带退避地重试(官方客户端:从 10ms 开始, 倍增至 200ms)。等待队列腾出空位后,下一次尝试就能正常排队。只有当 wait 耗尽时仍然 处于满载状态,才应以"繁忙"错误告知调用方。

重试必须使用相同的 owner —— 这样即使在此期间获取已经成立,服务器也会将其识别为 同一次获取。

字节表示法: op 是 ASCII 字符,owner 是二进制(u64,大端序),key 是 UTF-8 文本(变长,在结构中以 N 表示)。末尾的 \n0A。固定头部是二进制值,可能 包含 0x0A,因此必须在扫描换行符之前先按字节数消费

流程

客户端
服务器
A · 获取 (key · owner)
该 key 的等待队列已达到 max_waiters
B · 繁忙 (回传 owner)
退避后用相同 owner 重试
A · 获取 (重试)
有空位后 → A · 已获取 (token)
请求响应

这个上限是内存防线而不是流控 —— 它防止已认证的客户端在单个 key 上无限堆积等待者, 从而耗尽服务器内存。该值设置得远高于正常扇出规模,因此平时不会看到这个响应。上限可通过 集群配置中的 max_waiters 调整。