Cuando varios procesos o varios servidores acceden al mismo recurso (cuenta, pedido, inventario, trabajo por lotes, etc.) al mismo tiempo, se produce contención. Los mutex o semáforos integrados en el lenguaje solo son válidos dentro de un mismo proceso — si hay varios procesos o están repartidos entre varios servidores, se necesita un mecanismo de exclusión mutua que trascienda los límites del proceso.
Ticketing es precisamente un servidor de bloqueo y un conjunto de clientes para resolver este problema: la exclusión mutua distribuida que trasciende los límites de proceso y de servidor. El cliente se conecta al servidor de bloqueo por TCP, adquiere (acquire) una clave (key) con nombre, y tras pasar por la sección crítica la libera (release).
Diseñado con campos binarios de ancho fijo, se lee directamente por offset sin análisis (parsing) — mínima sobrecarga por solicitud.
Cada vez que se adquiere un bloqueo, el servidor entrega junto con él un token de fencing u64 monótonamente creciente. Si el recurso protegido valida esta monotonicidad del token, puede rechazar el acceso de un cliente que se despierta tarde tras la expiración del lease con un token más bajo. Como resultado, se puede mantener la seguridad aunque el propio servidor de bloqueo no sea perfectamente consistente en todo momento — algo especialmente importante durante los períodos de failover.
Funciona incluso con un solo servidor (modo único), pero si se necesita operación sin interrupciones, se configura un clúster con un mínimo de 2 servidores. El clúster no elige al activo por consenso (quórum), sino basándose en prioridad, y el resto se convierte en standby que recibe replicación en tiempo real. Si el activo muere (incluyendo reinicios) o se cierra de forma controlada (graceful), el standby toma el relevo. Para más detalles, consulta la página Principio de funcionamiento.
Sobre el mismo protocolo binario se ofrecen clientes oficiales en múltiples lenguajes: Rust, Java/Kotlin, JavaScript/TypeScript, Python, C#, Go, Ruby, C/C++. Cada lenguaje expone la API de forma natural para su ecosistema — por ejemplo, los lenguajes con async/await lo hacen de forma asíncrona, mientras que Go/Ruby/C combinan bloqueo con threads de segundo plano. El protocolo es idéntico byte a byte en todos los lenguajes. Para la instalación y ejemplos por lenguaje, consulta la página Librerías.