Caerus LogoCaerusDocs

Especificación de Servicios gRPC (Protobuf)

Core Protocol

Referencia 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++.

caerus-dev/caerus-protosDefiniciones canónicas .proto

Descargá o cloná los esquemas sre_service.proto y dls_service.proto para compilar tus propios clientes con protoc o buf.

Ver en GitHub
caerus.sre.v1.SharedResourceEngine
Motor de inventario transaccional para recursos limitados, reservas temporales bajo TTL, extensiones y confirmación permanente de adquisiciones.
caerus.dls.v1.DistributedLockingEngine
Coordinación distribuida con exclusión mutua estricta, bloqueos de lectura/escritura (Read-Write), transacciones con timeout y Fencing Tokens monotónicos respaldados por consenso.
SRE Servicepackage caerus.sre.v1

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 Inventario

Registra 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.

sre_service.proto
protobuf
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 Stock

Modifica 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.

sre_service.proto
protobuf
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 Recurso

Elimina 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ítica

Aparta temporalmente la cantidad de unidades solicitadas (amount) y crea un ResourceHolder en estado PENDING (o QUEUED si la plantilla implementa cola de espera).

sre_service.proto
protobuf
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ón

Consolida 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.

sre_service.proto
protobuf
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 Temprana

Libera 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 TTL

Otorga 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

GetResourceGetResourceRequest

Consulta disponibilidad en tiempo real (available_amount), cantidad de reservas en progreso (pending_count) y metadata.

GetResourcesByGroupKeyGetResourcesByGroupKeyRequest

Devuelve listado paginado (resources y bandera next_page) de todos los recursos agrupados bajo un mismo group_key.

GetResourceHolderGetResourceHolderRequest

Consulta el estado de una reserva por su ID: PENDING, CONFIRMED, RELEASED, QUEUED o EXPIRED.

GetResourceHoldersListGetResourceHoldersListRequest

Listado paginado de holders históricos y activos, filtrables por clave de recurso, estado y orden cronológico.

DLS Servicepackage caerus.dls.v1

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ón

Inicia 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.

dls_service.proto
protobuf
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 TTL

Extiende 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ómica

Libera 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 Streaming

Solicita 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 QUEUED periódicos como keep-alive para evitar desconexiones por timeout en proxies o firewalls.
  • Al liberarse el recurso, emite un evento terminal ACQUIRED y cierra el stream.
  • Si se agota el tiempo o la política es rechazo inmediato, emite un evento DENIED y finaliza.
dls_service.proto
protobuf
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: El valor 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 Puntual

Libera 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

GetLockStatusGetLockStatusResponse

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).

GetTransactionStatusGetTransactionStatusResponse

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:

FAILED_PRECONDITIONHTTP 409 Conflict

Recurso unitario ya retenido por otro cliente, o saldo insuficiente para satisfacer la cantidad solicitada en Take.

NOT_FOUNDHTTP 404 Not Found

La clave de recurso, el holderId o la plantilla especificada en el namespace no existen o fueron eliminados.

UNAUTHENTICATEDHTTP 401 Unauthorized

Falta el metadata header x-api-key o la API key provista es inválida o fue revocada.

INVALID_ARGUMENTHTTP 400 Bad Request

Se omitió una clave de idempotencia exigida por la plantilla o los valores de cantidad/TTL son negativos o ilegales.

DEADLINE_EXCEEDEDHTTP 504 Gateway Timeout

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.

Guía del SDK