Skip to content

Propagate Events

Caracal uses Postgres outboxes for durable enqueue and Redis Streams for asynchronous delivery. Published modes sign stream messages with STREAMS_HMAC_KEY.

flowchart LR
  Tx[Postgres transaction] --> Outbox[event_outbox or caracal_outbox]
  Outbox --> Redis[Redis Streams]
  Redis --> Consumers[Consumers]
  Consumers --> Effects[Policy reload, revocation, audit ingest, relay]
  Producers[STS/Gateway audit emitters] --> Replay[Audit replay directory]
  Replay --> Redis
StreamProducersConsumers
caracal.audit.eventsAPI, STS, Gateway, Coordinator, ControlAudit audit-ingestor, SIEM exporters
caracal.audit.events.dlqAuditDLQ observers
caracal.policy.invalidateAPISTS policy loader
caracal.sessions.revokeAPI/CoordinatorSTS and resource/Gateway revocation consumers
caracal.keys.invalidateAPI/STSSTS key caches
caracal.agents.lifecycleCoordinatorCoordinator lifecycle relay job
caracal.invocations.lifecycleCoordinatorInvocation observers
caracal.delegations.invalidateCoordinatorDelegation observers
caracal.providers.ratelimitRedis provisioner/provider coordinationProvider rate-limit coordination
OutboxOwnerBehavior
event_outboxAPIDurable enqueue inside API transactions, cooperative dispatcher, signed Redis XADD, retry/backoff, dead-row metrics.
caracal_outboxCoordinatorDedupe by producer/topic/dedupe key and publishes Coordinator topics.

STS and Gateway use replay directories under /var/lib/caracal/audit-replay. When Redis or Audit is unavailable, replay files preserve pending audit events so they can drain after recovery.

Use Store State to understand which data is durable, transient, or recoverable.