menuTicketing

Пример сессии (побайтовая запись)

Целые числа — big-endian. ·· — лишь обозначение границы байта, а не реальный байт.

# Немедленное получение (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

Протокол репликации кластера между серверами описан в разделе Протокол (кластер).