현재 테스트 중입니다: 완료되면 GitHub 코드를 오픈할 예정입니다.

B · 사용 중

구조refresh

획득 요청(A)이 왔지만 키 대기열 또는 서버 전체의 key/waiter/pending/memory admission이 상한에 도달해 요청을 받아들이지 않았다는 응답입니다. 이 요청은 확정적으로 락을 얻지 않았으며, 요청 형식이 잘못된 것은 아닙니다.

owner는 요청에 실었던 값을 그대로 되돌려 준 상관자입니다 — 어느 획득 시도가 거절됐는지 정확히 알 수 있습니다(응답 매칭 규칙).

클라이언트 처리

공식 클라이언트는 상관된 B를 즉시 Busy/Capacity 계열 오류로 caller에게 반환하며, 같은 논리 acquire를 내부에서 자동 재전송하지 않습니다. 과부하 중 retry 폭주를 만들지 않기 위한 규칙입니다. caller가 다시 시도하려면 application 전체 deadline과 backoff를 정한 뒤 새 owner의 새 acquire를 명시적으로 시작합니다.

B를 실제로 받은 요청은 확정 미획득이므로 별도의 새 호출은 안전합니다. 응답을 받지 못한 전송을 B로 추정해서는 안 되며 그런 결과는 Indeterminate입니다.

바이트 표기: op는 ASCII 문자, owner는 바이너리(u64, 빅엔디안), key는 UTF-8 텍스트(가변, 구조에서 N)입니다. 마지막 \n0A. 고정 헤더는 이진 값이라 0x0A를 포함할 수 있으니, 개행을 찾기 전에 바이트 수로 먼저 소비해야 합니다.

흐름

클라이언트
서버
A · 획득 (key · owner)
키 대기열/서버 capacity가 상한에 도달
B · 사용 중 (owner 에코)
Busy 반환 — caller가 새 논리 acquire 여부 결정
A · 새 획득 (선택적 재시도)
자리가 나면 A · 획득됨 (token)
요청응답

상한은 메모리 방어선입니다. 데몬이 OOM으로 종료되기 전에 신규 acquire를 거부하고, exact-token release, 이미 승인된 응답, cleanup과 Raft 복구에는 예약 자원을 남깁니다. 상세 원인은 wire가 아니라 서버 metric/log의 key_busy, per_key_limit, global_overload 등으로 구분합니다.