B · 繁忙 (Busy)
结构refresh
获取请求(A)到达了,但该 key 的 等待队列已达到服务器上限(max_waiters,默认 16,384),因而无法排队。这只是 没有拿到锁,并不意味着请求本身有问题。
owner 是把请求中携带的值原样回传的关联标识 —— 可以准确知道是哪一次获取尝试被拒绝 (响应匹配规则)。
客户端处理
不要立即失败。 只要 wait 预算还有剩余,就应带退避地重试(官方客户端:从 10ms 开始, 倍增至 200ms)。等待队列腾出空位后,下一次尝试就能正常排队。只有当 wait 耗尽时仍然 处于满载状态,才应以"繁忙"错误告知调用方。
重试必须使用相同的 owner —— 这样即使在此期间获取已经成立,服务器也会将其识别为 同一次获取。
字节表示法:
op是 ASCII 字符,owner是二进制(u64,大端序),key是 UTF-8 文本(变长,在结构中以N表示)。末尾的\n为0A。固定头部是二进制值,可能 包含0x0A,因此必须在扫描换行符之前先按字节数消费。
流程
客户端
服务器
A · 获取 (key · owner)
该 key 的等待队列已达到 max_waiters
B · 繁忙 (回传 owner)
退避后用相同 owner 重试
A · 获取 (重试)
有空位后 → A · 已获取 (token)
请求响应
这个上限是内存防线而不是流控 —— 它防止已认证的客户端在单个 key 上无限堆积等待者, 从而耗尽服务器内存。该值设置得远高于正常扇出规模,因此平时不会看到这个响应。上限可通过 集群配置中的 max_waiters 调整。