Ticketing
Документация

B · Занято

Структураrefresh

Ответ означает, что запрос захвата (A) пришёл, но очередь ожидания этого ключа достигла серверного предела (max_waiters, по умолчанию 16 384), поэтому поставить запрос в очередь не удалось. Блокировка не получена, но сам запрос при этом корректен.

owner — это коррелятор: значение, отправленное в запросе и возвращённое без изменений. По нему точно понятно, какая именно попытка захвата была отклонена (Правила сопоставления ответов).

Обработка на клиенте

Нельзя завершать вызов ошибкой сразу. Пока остаётся бюджет wait, повторяйте попытку с backoff (в официальных клиентах: начиная с 10 мс и удваивая до 200 мс). Как только очередь освободится, следующая попытка встанет в неё штатно. Если переполнение сохраняется до исчерпания wait, только тогда сообщайте вызывающему коду об ошибке «занято».

Повторы нужно отправлять с тем же owner — иначе, если за это время захват всё же состоялся, сервер не распознает попытку как ту же самую.

Обозначение байтов: op — символ ASCII, owner — бинарный (u64, big-endian), key — текст в UTF-8 (переменной длины, N в структуре). Завершающий \n — это 0A. Фиксированный заголовок — бинарное значение и может содержать 0x0A, поэтому его нужно сначала вычитать по количеству байт, и лишь затем искать перевод строки.

Поток

Клиент
Сервер
A · acquire (key · owner)
очередь этого ключа достигла max_waiters
B · busy (эхо owner)
после backoff — повтор с тем же owner
A · acquire (повтор)
как только освободится место — A · acquired (token)
запросответ

Этот предел — не механизм управления потоком, а защита памяти: он не даёт аутентифицированному клиенту бесконечно наращивать очередь ожидания на одном ключе и исчерпать память сервера. Он выставлен с большим запасом относительно нормального веера запросов, так что в обычной работе этот ответ не встречается. Предел настраивается параметром max_waiters в конфигурации кластера.