Especificación de Servicios gRPC (Protobuf)
Core ProtocolReferencia exhaustiva y agnóstica al lenguaje de programación de los contratos Protocol Buffers (proto3) que definen la API de transporte de alto rendimiento de Caerus.
Protocolo gRPC & Protobuf
Toda la comunicación de alto rendimiento de Caerus opera bajo el protocolo gRPC sobre HTTP/2 con serialización binaria Protocol Buffers v3 (proto3).
Esta especificación describe los métodos RPC, sus parámetros de entrada, mensajes de respuesta y comportamientos semánticos de forma completamente independiente de si utilizas nuestro SDK en TypeScript/Node.js o clientes generados en Python, C#, Rust o C++.
Descargá o cloná los esquemas sre_service.proto y dls_service.proto para compilar tus propios clientes con protoc o buf.
Servicio SharedResourceEngine
El servicio SRE gestiona el inventario de recursos compartidos (butacas, cupos de inscripción, stock limitado) asegurando atomicidad estricta y evitando cualquier condición de sobreventa (zero overbooking).
1. Gestión de Inventario de Recursos
rpc CreateResource (CreateResourceRequest) returns (ResourceResponse)
Alta de InventarioRegistra un nuevo recurso dentro de un entorno de aplicación asociado a una plantilla existente (template_name). Define la cantidad inicial de unidades disponibles y opcionalmente un grupo y metadata JSON arbitraria.
message CreateResourceRequest { // Plantilla (define TTL, idempotencia y estrategia de conflicto) string template_name = 1; // Identificador único del recurso (ej: "seat_J4", "curso_react_2026") string key = 2; // Cantidad inicial (1 para Unitarios, N para Pooled) int32 available_amount = 3; // Clave de agrupación opcional (ej: "fila_J", "sala_1") optional string group_key = 4; // Metadata arbitraria en formato JSON string optional string metadata = 5;}Comportamiento semántico: Si el recurso ya existe con esa misma key en el entorno, responde con error ALREADY_EXISTS (409).
rpc UpdateResource (UpdateResourceRequest) returns (ResourceResponse)
Ajuste de StockModifica la disponibilidad de un recurso existente sumando o restando unidades mediante un delta atómico (delta_amount). Permite reponer stock (+10) o dar de baja mercadería (-2) sin pisar reservas en curso.
message UpdateResourceRequest { // Clave del recurso a modificar string resource_key = 1; // Incremento (+) o decremento (-) de inventario int32 delta_amount = 2; // Actualiza el grupo si se proporciona optional string group_key = 3; // Actualiza o fusiona la metadata JSON optional string metadata = 4; // Clave para evitar ajustes duplicados en reintentos optional string idempotency_key = 5;}Precondición: Si el decremento provocaría que available_amount < 0, la operación es rechazada de forma atómica con FAILED_PRECONDITION sin alterar el inventario.
rpc DeleteResource (DeleteResourceRequest) returns (google.protobuf.Empty)
Baja de RecursoElimina el recurso del inventario activo. Si tiene reservas pendientes (PENDING), estas se invalidan o expiran según la configuración del template.
2. Operaciones de Reserva y Ciclo de Vida
rpc Take (TakeRequest) returns (ResourceHolderResponse)
Operación CríticaAparta temporalmente la cantidad de unidades solicitadas (amount) y crea un ResourceHolder en estado PENDING (o QUEUED si la plantilla implementa cola de espera).
message TakeRequest { // Clave del recurso string resource_key = 1; // Unidades a reservar (1 para Unitarios) int32 amount = 2; TakeOptionalSettings settings = 3;} message TakeOptionalSettings { // Garantiza que peticiones repetidas devuelvan el mismo holder optional string idempotency_key = 1; // Sobrescribe el TTL de la plantilla (ej: 180 segundos) optional int32 custom_ttl_seconds = 2; // JSON string con datos de la sesión o comprador optional string metadata = 3;}Retorno: Devuelve un ResourceHolderResponse con el holder_id único, la marca de tiempo de expiración absoluta expires_at (en milisegundos de época) y el estado PENDING.
Errores: Si el recurso no tiene saldo o ya está tomado bajo estrategia FAIL, devuelve FAILED_PRECONDITION (409).
rpc Confirm (ConfirmRequest) returns (ResourceHolderResponse)
ConsolidaciónConsolida la adquisición de forma definitiva una vez que el flujo de negocio externo (por ejemplo, el cobro en una pasarela de pago) concluyó con éxito. Pasa el estado del holder a CONFIRMED y cancela el temporizador de expiración por TTL.
message ConfirmRequest { // ID del holder emitido por Take string resource_holder_id = 1; // Opcional: datos finales a adjuntar (ej: {"paymentId": "ch_3M..."}) optional string metadata_patch = 2;}rpc Release (ReleaseRequest) returns (google.protobuf.Empty)
Cancelación TempranaLibera anticipadamente el recurso cuando el usuario desiste de la compra o el pago falla, reintegrando las unidades al inventario inmediatamente sin necesidad de esperar a que expire el TTL.
rpc Extend (ExtendRequest) returns (ResourceHolderResponse)
Prórroga de TTLOtorga tiempo adicional (extra_ms) a una reserva en curso en caso de que el cliente requiera más tiempo para completar un formulario o verificación biométrica.
3. Métodos de Consulta e Inspección
Consulta disponibilidad en tiempo real (available_amount), cantidad de reservas en progreso (pending_count) y metadata.
Devuelve listado paginado (resources y bandera next_page) de todos los recursos agrupados bajo un mismo group_key.
Consulta el estado de una reserva por su ID: PENDING, CONFIRMED, RELEASED, QUEUED o EXPIRED.
Listado paginado de holders históricos y activos, filtrables por clave de recurso, estado y orden cronológico.
Servicio DistributedLockingEngine
El servicio DLS proporciona coordinación de procesos distribuidos para asegurar que secciones críticas de código no sufran condiciones de carrera ni inconsistencias por particiones de red o split-brain.
1. Sesiones Transaccionales
rpc BeginTransaction (BeginTransactionRequest) returns (BeginTransactionResponse)
Inicio de SesiónInicia una transacción de bloqueo y devuelve un identificador único (transaction_id). Todos los locks que un proceso adquiera durante una operación atómica se asocian a este identificador.
message BeginTransactionRequest { // Tiempo de expiración de seguridad de la transacción (ms) optional int64 timeout_ms = 1;} message BeginTransactionResponse { // ID de correlación generado para asociar los locks string transaction_id = 1;}rpc RenewTransaction (RenewTransactionRequest) returns (RenewTransactionResponse)
Heartbeat TTLExtiende el tiempo límite de vida (extra_ms) de una transacción en ejecución si el proceso que la opera detecta que la sección crítica requiere más tiempo de procesamiento.
rpc ReleaseTransactionLocks (ReleaseTransactionLocksRequest) returns (google.protobuf.Empty)
Limpieza AtómicaLibera atómicamente todos los locks asociados a una transacción. Permite en una sola llamada de red desbloquear múltiples recursos tomados durante el flujo de trabajo.
2. Adquisición y Streaming de Bloqueos
rpc AcquireLock (AcquireLockRequest) returns (stream AcquireLockResponse)
Server StreamingSolicita el bloqueo sobre una clave dinámica (lock_key) dentro de un namespace. Utiliza Server Streaming para manejar esperas sin bloquear hilos de ejecución:
- Si el lock está ocupado y la plantilla admite espera, el servidor emite eventos
QUEUEDperiódicos como keep-alive para evitar desconexiones por timeout en proxies o firewalls. - Al liberarse el recurso, emite un evento terminal
ACQUIREDy cierra el stream. - Si se agota el tiempo o la política es rechazo inmediato, emite un evento
DENIEDy finaliza.
enum LockMode { MODE_UNSPECIFIED = 0; // Exclusión mutua estricta (solo 1 proceso a la vez) EXCLUSIVE = 1; // Bloqueo compartido de lectura (múltiples lectores) SHARED_READ = 2;} message AcquireLockRequest { // Plantilla de lock configurada en el dashboard string namespace = 1; // Identificador del recurso bloqueado (ej: "wallet_user_8821") string lock_key = 2; optional string idempotency_key = 3; // EXCLUSIVE o SHARED_READ optional LockMode requested_mode = 5; // ID devuelto por BeginTransaction string transaction_id = 6;} message AcquireLockResponse { // ID asignado a la reserva de lock string lock_id = 1; // Fencing Token monotónicamente creciente int64 fencing_token = 2; // Estado: ACQUIRED, DENIED o QUEUED LockStatus status = 3;}fencing_token se incrementa estrictamente con cada adquisición. Los procesos deben enviar este token a las bases de datos o servicios de almacenamiento secundarios para descartar escrituras tardías de workers demorados por recolección de basura o pausas de red (prevención contra split-brain).rpc ReleaseLock (ReleaseLockRequest) returns (google.protobuf.Empty)
Liberación PuntualLibera un lock individual identificado por su lock_id y vinculado a su transaction_id, permitiendo a los procesos en espera encolados adquirir el recurso de inmediato.
3. Inspección y Diagnóstico en Tiempo Real
Indica si el lock está retenido (is_held), el modo actual (EXCLUSIVE o SHARED_READ), la lista de active_holders y la cantidad de procesos en cola (pending_queue_size).
Informa el estado de la transacción (ACTIVE, ABORTED, etc.), causa de aborto si ocurrió y todos los locks retenidos o en espera.
Mapeo Canónico de Códigos de Error gRPC
Cualquier cliente gRPC (independientemente del lenguaje de desarrollo) recibirá los códigos estándar definidos por la especificación oficial de gRPC:
Recurso unitario ya retenido por otro cliente, o saldo insuficiente para satisfacer la cantidad solicitada en Take.
La clave de recurso, el holderId o la plantilla especificada en el namespace no existen o fueron eliminados.
Falta el metadata header x-api-key o la API key provista es inválida o fue revocada.
Se omitió una clave de idempotencia exigida por la plantilla o los valores de cantidad/TTL son negativos o ilegales.
La operación excedió el tiempo límite configurado o el timeout de la transacción expiró antes de su confirmación.
¿Utilizas TypeScript o Node.js?
Consulta la guía del SDK oficial con tipado estricto y manejo de excepciones.