How scalar-labs/scalardb-saga works
Purpose and deployment modes
ScalarDB Saga is a Java saga/TCC orchestration system for distributed service workflows. It persists durable state and an append-only event history through ScalarDB rather than requiring a broker. It can run embedded (including Java code steps) or as a standalone server with REST and gRPC APIs.
• core/src/main/java/com/scalar/db/saga/engine/SagaEngine.java
• server/src/main/java/com/scalar/db/saga/server/SagaServer.java
• api/src/main/java/com/scalar/db/saga/api/SagaOrchestrator.java
Public contracts and client entry points
The api module defines application-facing orchestration, administration, step, context, status, detail, and exception contracts. Embedded callers construct/use the default engine services; remote Java 8-compatible callers use gRPC SDK implementations. RPC schemas are the protocol boundary between client and server.
• api/src/main/java/com/scalar/db/saga/api/SagaAdminService.java
• api/src/main/java/com/scalar/db/saga/api/Step.java
• client/src/main/java/com/scalar/db/saga/grpc/GrpcSagaOrchestratorClient.java
• rpc/src/main/proto/saga.proto
Definition and step-resolution layer
Saga definitions are parsed from JSON/YAML, versioned/registered, and turned into executable steps. Definitions support conventional saga execution/compensation and TCC reservation/confirmation/cancellation. Steps may resolve reflectively in embedded mode or bind declarative service calls to transport adapters.
• core/src/main/java/com/scalar/db/saga/definition/SagaDefinitionParser.java
• core/src/main/java/com/scalar/db/saga/engine/SagaDefinitionRegistry.java
• core/src/main/java/com/scalar/db/saga/engine/ReflectiveStepResolver.java
• core/src/main/java/com/scalar/db/saga/transport/DeclarativeBindingTccStep.java
Execution, state transitions, and recovery
SagaEngine drives steps in order, records attempted outcomes, applies retry/timeout policy, and compensates completed work in reverse on saga failure. TCC follows reserve-before-confirm semantics; confirmation failures are recovery-driven forward progress. Recovery managers find stranded nonterminal sagas, resolve the appropriate action from durable history, and retry; retention removes old data under policy.
• core/src/main/java/com/scalar/db/saga/engine/SagaEngine.java
• core/src/main/java/com/scalar/db/saga/engine/SagaRecoveryManager.java
• core/src/main/java/com/scalar/db/saga/engine/RecoveryActionResolver.java
• core/src/main/java/com/scalar/db/saga/engine/TimeoutPolicy.java
Persistence boundary
The engine depends on the SagaStore abstraction, with ScalarDbSagaStore implementing durable definitions, state snapshots, events, listing, and administrative audit records via ScalarDB. The event/state model enables another replica to resume a crashed coordinator; step implementations must therefore be idempotent when execution occurred before its result was recorded.
• core/src/main/java/com/scalar/db/saga/store/SagaStore.java
• core/src/main/java/com/scalar/db/saga/store/ScalarDbSagaStore.java
• core/src/main/java/com/scalar/db/saga/store/SagaEvent.java
• core/src/main/java/com/scalar/db/saga/store/SagaSchema.java
Participant-service transport and asynchronous callbacks
Declarative steps issue outbound HTTP calls through a transport abstraction, classify HTTP/transport failures for retryability, interpolate/capture saga-context values, and propagate correlation. Long-running participant work can return asynchronously and resume a saga through callback handling; callback URLs are HMAC-protected in server mode.
• core/src/main/java/com/scalar/db/saga/transport/HttpTransportAdapter.java
• core/src/main/java/com/scalar/db/saga/transport/OutboundHttpPolicy.java
• core/src/main/java/com/scalar/db/saga/transport/SagaCorrelationContext.java
• server/src/main/java/com/scalar/db/saga/server/api/CallbackResource.java
Server edge, security, and infrastructure
The server composes the core engine, ScalarDB-backed store, REST resources, and generated gRPC services. Both transports enforce authentication/authorization and rate limiting before orchestration/admin operations. Supported security providers include API keys, JWT, or noop; deployment is a Java 21 container, while client/API/RPC artifacts target Java 8. ScalarDB connects this service to supported relational, NoSQL, or cloud database backends.
• server/src/main/java/com/scalar/db/saga/server/SagaServerCommand.java
• server/src/main/java/com/scalar/db/saga/server/api/SagaResource.java
• server/src/main/java/com/scalar/db/saga/server/grpc/SagaServiceImpl.java
• server/src/main/java/com/scalar/db/saga/server/security/SagaSecurityHandler.java
• server/docker/Dockerfile
Main entry points: SagaEngine.java Saga engine · ScalarDbSagaStore.java ScalarDB saga store · SagaRecoveryManager.java Recovery manager · SagaServer.java Saga server
Components 21
Client contracts
- Public API contracts · Orchestration, admin, step, and saga model contracts.
api/src/main/java/com/scalar/db/saga/api/SagaOrchestrator.java - gRPC Java client
client/src/main/java/com/scalar/db/saga/grpc/GrpcSagaOrchestratorClient.java - Saga RPC schema · Protocol boundary for remote clients and server.
rpc/src/main/proto/saga.proto
Saga core
- Definition parser · Parses JSON/YAML saga definitions.
core/src/main/java/com/scalar/db/saga/definition/SagaDefinitionParser.java - Definition registry · Versions and registers executable definitions.
core/src/main/java/com/scalar/db/saga/engine/SagaDefinitionRegistry.java - Step resolution · Resolves embedded reflective and declarative TCC steps.
core/src/main/java/com/scalar/db/saga/engine/ReflectiveStepResolver.java - Saga engine · Drives execution, retries, compensation, and TCC transitions.
core/src/main/java/com/scalar/db/saga/engine/SagaEngine.java - Recovery manager · Resumes stranded sagas from durable history.
core/src/main/java/com/scalar/db/saga/engine/SagaRecoveryManager.java - Recovery action resolver
core/src/main/java/com/scalar/db/saga/engine/RecoveryActionResolver.java - Saga store · Durable definitions, snapshots, events, listings, and audit records.
core/src/main/java/com/scalar/db/saga/store/SagaStore.java - ScalarDB saga store
core/src/main/java/com/scalar/db/saga/store/ScalarDbSagaStore.java - Saga event history · Append-only history supports cross-replica recovery.
core/src/main/java/com/scalar/db/saga/store/SagaEvent.java - HTTP transport adapter · Executes declarative participant calls with failure classification.
core/src/main/java/com/scalar/db/saga/transport/HttpTransportAdapter.java
Server runtime
- Saga server · Composes engine, store, REST, and gRPC endpoints.
server/src/main/java/com/scalar/db/saga/server/SagaServer.java - Security gateway · Enforces API key, JWT, or noop security before operations.
server/src/main/java/com/scalar/db/saga/server/security/SagaSecurityHandler.java - REST saga resource
server/src/main/java/com/scalar/db/saga/server/api/SagaResource.java - gRPC saga service
server/src/main/java/com/scalar/db/saga/server/grpc/SagaServiceImpl.java - Async callbacks · Resumes long-running work from HMAC-protected callbacks.
server/src/main/java/com/scalar/db/saga/server/api/CallbackResource.java - Server container
server/docker/Dockerfile
Other components
- Participant services · Idempotent services execute saga and TCC actions.
- ScalarDB · Connects saga storage to supported database backends.
Connections 23
- gRPC Java client → Saga RPC schema: uses
- Saga RPC schema → gRPC saga service: generates contract
- Public API contracts → Saga engine: embedded orchestration
- Definition parser → Definition registry: parsed definitions
- Definition registry → Saga engine: executable definition
- Saga engine → Step resolution: resolves steps
- Step resolution → HTTP transport adapter: declarative actions
- HTTP transport adapter → Participant services: HTTP actions
- Saga engine → Saga store: records state and outcomes
- Recovery manager → Saga store: finds nonterminal sagas
- Recovery manager → Recovery action resolver: selects next action
- Recovery manager → Saga engine: retries or resumes
- Saga store → ScalarDB saga store: implemented by
- ScalarDB saga store → Saga event history: persists
- ScalarDB saga store → ScalarDB: uses
- Saga server → Saga engine: composes
- Saga server → ScalarDB saga store: composes
- Security gateway → REST saga resource: guards
- Security gateway → gRPC saga service: guards
- REST saga resource → Saga engine: orchestration and admin
- gRPC saga service → Saga engine: orchestration and admin
- Async callbacks → Saga engine: resumes saga
- Server container → Saga server: packages