menuTicketing

セッション例(バイト表記)

整数はビッグエンディアン。··はバイト境界を示すだけで、実際のバイトではありません。

# 即時取得 (wait=5s, lease=30s), key="order-1234"
クライアント → 'A' 00·05 00·1E "order-1234" \n
サーバー → 'A' 00·00·00·00·00·00·00·01 "order-1234" \n     (トークン 1)

# 占有中の待機 (別接続, wait=1s)
クライアント2 → 'A' 00·01 00·1E "order-1234" \n
                                       ... 保留 ...
# (a) 保有者が解放すると即時引き渡し
クライアント  → 'R' "order-1234" \n
サーバー → 'R' "order-1234" \n                              (クライアント: 解放済み)
サーバー → 'A' 00·00·00·00·00·00·00·02 "order-1234" \n      (クライアント2: 引き渡し、より大きいトークン)
# (b) wait(1s)以内に受け取れなければ
サーバー → 'T' "order-1234" \n                              (クライアント2: タイムアウト — grantなし)

# 存在しないキーの解放 / 不正なリクエスト
クライアント → 'R' "ghost" \n        → サーバー 'N' "ghost" \n
クライアント → 'Z' ...              → サーバー 'E' "bad_op" \n

バイナリなのでncでも素早く確認できます。

sh
# 取得: key=order-1, wait=5s(00 05), lease=30s(00 1e)
printf 'A\x00\x05\x00\x1eorder-1\n' | nc -w1 127.0.0.1 5225 | xxd
# → 41 0000000000000001 6f72646572...  ('A' + token=1 + "order-1")

printf 'Rorder-1\n' | nc -w1 127.0.0.1 5225 | xxd    # → 52 ... ('R' + "order-1")
printf 'Zx\n'       | nc -w1 127.0.0.1 5225          # → Ebad_op

サーバー↔サーバー間のクラスターレプリケーションプロトコルはプロトコル (クラスター)で扱います。