Ticketing
ドキュメント

B · ビジー

構造refresh

獲得リクエスト(A)が届いたものの、そのキーの 待機キューがサーバーの上限(max_waiters、デフォルト16,384)に達していたため、 キューに並べられなかったという応答です。ロックを得られなかっただけであり、リクエスト自体が 不正だったわけではありません。

ownerはリクエストに載せた値をそのまま返した相関子です — どの獲得試行が拒否されたのかを 正確に知ることができます (応答マッチングルール)。

クライアントの処理

即座に失敗させてはいけません。 waitの予算が残っている限り、バックオフを入れて再試行して ください(公式クライアント: 10msから始めて200msまで倍増)。キューが空けば、その次の試行は 通常どおりキューに並びます。waitが尽きるまで満杯が続いた場合に初めて、「ビジー」エラーとして 呼び出し元に伝えます。

再試行は同じownerで送る必要があります — そうすれば、その間に獲得が成立していても サーバーが同じ獲得と認識します。

バイト表記: opはASCII文字、ownerはバイナリ(u64、ビッグエンディアン)、keyはUTF-8 テキスト(可変長、構造上はNと表記)です。末尾の\n0Aです。固定ヘッダはバイナリ値のため 0x0Aを含みうるので、改行を探す前にバイト数で先に消費しなければなりません。

フロー

クライアント
サーバー
A · 獲得 (key · owner)
このキーの待機キューがmax_waitersに到達
B · ビジー (ownerをエコー)
バックオフ後、同じownerで再試行
A · 獲得 (再試行)
空きができたら → A · 獲得済み (token)
リクエストレスポンス

この上限はフロー制御ではなくメモリの防衛線です — 認証済みのクライアントが1つのキーに 無制限に待機を積み上げ、サーバーのメモリを枯渇させることを防ぎます。通常のファンアウトより 十分に余裕をもって設定されているため、平常時にこの応答を目にすることはありません。上限は クラスタ設定max_waitersで調整します。