Сейчас идёт тестирование: код на GitHub будет открыт после завершения.

Библиотека Ticketing для Go

GitHub pkg.go.dev

Репозиторий

bash

Пример

Базовый пример

Создайте один broker при запуске приложения и используйте совместно. wait=0 — одна немедленная попытка без queue, максимум 255 с; lease — 1–250 с. Последний minimum-work budget обязателен и может быть нулём. Доли секунды округляются вверх; значения вне диапазона и budget больше нормализованной lease отклоняются до отправки, без clamp.

go
import ticketing "github.com/saro-lab/ticketing/ticketing-go"

broker := ticketing.Connect("127.0.0.1:5225")
broker.WaitReady(ctx, 5*time.Second)

ticket, err := broker.Acquire(ctx, "key", 5*time.Second, 30*time.Second, 2*time.Second)
if err != nil {
    return err
}
defer ticket.Close()
token := ticket.Token
// In the same DB transaction: verify/update token high-water and perform the business write.

Автоматический close/drop — ограниченный best-effort release. Если важен результат, используйте явный release API. Token обязан fence защищённый DB write в той же transaction.

Полезно знать (поведение)

  • Если мог быть отправлен хотя бы один request byte, потеря окончательного ответа даёт Indeterminate. A не отправляется автоматически с тем же owner; caller не входит в critical section.
  • Cancel до send — unsent; после possible-send закрывает session. Если grant token параллельно распознан, выполняется ограниченный компенсационный exact-token release.
  • M, каждый E и malformed/oversized/unknown response — session-fatal. Неопределённые possible-send acquire становятся Indeterminate.
  • B — окончательный capacity reject и возвращается сразу. Внутреннего retry нет; caller может после application backoff начать новый acquire с новым owner.
  • Явный/компенсационный release повторяет exact token только абсолютные 5 секунд от call/enqueue. R успех, N отсутствует/не текущий; нет окончательного ответа — ошибка, не предполагаемый успех.
  • Ticket выдаётся лишь при положительном консервативном остатке времени, достаточном для work budget. Работа свыше 250 с unsupported до отправки.
  • DB fencing по token обязателен: в той же transaction отклонить token <= stored_high_water, обновить high-water и выполнить business write до commit/rollback и release.

Параметры безопасности (токен · TLS)

Все опции необязательны. Token должен совпадать с client_tokens сервера, а TLS имеет четыре режима: выкл / системное хранилище доверия / указанный CA / пропуск проверки (только для тестов).

go
broker, err := ticketing.New(ticketing.Options{
    Addrs: []string{"10.0.0.1:5225", "10.0.0.2:5225", "10.0.0.3:5225"},
    Token: "123",
    TLS:   ticketing.TLSSystemRoots(), // TLSOff() | TLSCa("ca.crt") | TLSInsecureSkipVerify()
})

Настроить токен, TLS и конфигурацию кластера на стороне сервера можно на странице Развёртывание сервера Ticketing.