Skip to content

Durable Execution ​

A survey of durable execution: making a long-running program survive the death of its process by journaling the results of its effects and re-deriving everything else. The technique sits directly downstream of algebraic effects — the journaling layer is a handler over an effect boundary — but it grew up in a different literature, and the two have barely met.

The survey is deliberately application-neutral: it reads each system on its own terms and judges it by what its own users need. sparkles has no durable- execution layer today, and the gap between the state of the art and what sparkles:event-horizon's capability row already provides is recorded in the comparison's delta table — but no consumer's requirements shaped which questions were asked or which answers were judged good.

Last reviewed: September 12, 2026.


The eleven questions this survey answers ​

  1. How is an effectful step identified and matched on replay? → Comparison §1, and every deep-dive's Analysis §1.
  2. When the journal and the world disagree, which wins, and how is disagreement detected? → Comparison §2, ARIES, Helland.
  3. How is determinism between journaled steps enforced? → Comparison §3, deterministic record and replay, deterministic simulation testing.
  4. How are compensations registered, ordered and triggered? → Comparison §4, Sagas, compensation calculi.
  5. How does workflow code evolve against journals written by older code? → Comparison §5, Golem, Temporal.
  6. How do concurrent steps replay? → Comparison §6, compensation calculi.
  7. Replay or snapshot: what does each cost and rule out? → replay versus continuation snapshotting, Comparison §7.
  8. How is a durable program tested? → Comparison §8, deterministic simulation testing, and the runnable replay-journal example.
  9. How is the record written safely, and what stops two writers corrupting it? → Comparison §9, ARIES, Marten, Akka/Pekko.
  10. What can a person do to a run that is stuck, wrong, or diverged? → Comparison §10, Temporal, Golem, deterministic record and replay.
  11. How does a program wait for something it did not invoke? → Comparison §11, Restate, Effect, Trigger.dev.

The last three were added after a first pass over the finished catalog showed that every subject had an answer to them, scattered through the prose rather than asked uniformly.

Start with Concepts and Vocabulary if the terms are unfamiliar: the field has no agreed names, and the same idea is a step, an activity, a journal entry and an oplog entry depending on whose documentation you are reading.


Master catalog ​

Durable-execution engines and SDKs ​

SubjectLanguagePersistence modelStep identityLink
@effect/workflow + @effect/clusterTypeScriptreplayname + attempteffect-workflow
TemporalGo server; Go + TypeScript SDKsreplaypositional counterTemporal
RestateRust server; TypeScript SDKreplaypositional + header checkRestate
DBOS TransactTypeScript (+ Python, Go, Java)replaypositional function_idDBOS
Azure Durable FunctionsC# (DTFx) + JavaScriptreplay; entities snapshotpositional ordinalazure
Dapr Workflow + Durable Task FrameworkC#, Goreplaypositional idCounterdapr
InngestGo server; TypeScript SDKreplayhashed name + repeat counterInngest
Cloudflare WorkflowsTypeScript on workerdreplayname + occurrence countcloudflare
Vercel Workflow DevKitTypeScript (SWC plugin)replayseeded deterministic ULIDvercel
ResonateRust server; TypeScript SDKreplayderived promise idResonate
GolemRust runtime; any WASM guestreplay + optional state snapshotpositional + structural claimGolem

Contrast cases ​

SubjectLanguagePersistence modelWhy it is hereLink
Trigger.devTypeScriptsnapshot (CRIU process checkpoint)the one system that really snapshots a computationtrigger
AWS Step FunctionsAmazon States Languageexplicit state machinecontrol flow as data; the rejected design alternativeasf

Event-sourced state ​

SubjectLanguagePersistence modelLink
Akka / Pekko PersistenceScala, Javaevent log + snapshotsakka
Orleans.NETsnapshot, event log, or both per providerOrleans
KurrentDB (EventStoreDB).NETappend-only log + projectionskurrent
Marten.NET on PostgreSQLevent log + inline/async projectionsMarten

Theory ​

SubjectYear / venueGrounds questionsLink
Sagas (Garcia-Molina, Salem)SIGMOD 19874, 9, 10sagas
ARIES write-ahead logging (Mohan et al.)TODS 19921, 2, 4, 8, 9, 10wal
Compensation calculi (cCSP; Bruni et al.; Helland)2005, 2005, 20092, 4, 6, 9, 10calculi
Idempotence and the outside world (Helland)CIDR 2007, Queue 20121, 2, 4, 9, 11idempotence
Durable Functions: Semantics for Stateful ServerlessOOPSLA 20211, 2, 3, 6, 7, 9, 11burckhardt
Netherite: Efficient Execution of Serverless WorkflowsVLDB 20222, 3, 7, 9Netherite
Deterministic record and replay (rr and ancestors)1987–20171, 3, 6, 7, 9, 10, 11replay
Replay versus continuation snapshotting2006–20265, 7, 9, 10, 11replay-vs-snapshot
Deterministic simulation testing2014–20263, 8, 9, 10dst
Effect handlers and record/replay2013–20221, 3, 4, 9, 11handlers

Taxonomy ​

By persistence model ​

ModelSubjects
Replay onlyTemporal, Restate, DBOS, dapr, Inngest, cloudflare, vercel, Resonate, effect-workflow
Replay + state snapshotGolem, azure (entities), Netherite, Orleans, Marten, akka, kurrent
Continuation snapshottrigger; historically Termite Scheme and Unison (replay-vs-snapshot)
Explicit state machineasf

By step identity ​

SchemeSubjectsConsequence
PositionalTemporal, azure, dapr, DBOS, Restate, Netherite, Golemediting the program is a compatibility event; needs patch markers
NamedInngest, cloudflare, effect-workflowfree reordering; name collisions and silent renames
DerivedResonate, vercelstable without naming discipline; opaque in the journal
Nonetrigger, asfnothing re-executes, so nothing is matched

By determinism enforcement ​

DegreeSubjects
By constructionNetherite, burckhardt
By sandboxGolem, vercel, Temporal (TypeScript)
By substitutionTemporal (Go), azure, dapr, Restate
By static analysisazure (.NET only)
By disciplineInngest, DBOS, cloudflare, Resonate, Orleans, Marten
Not requiredtrigger, asf

By journal ownership ​

OwnerSubjects
A dedicated serverTemporal, Restate, Inngest, Resonate, asf, kurrent
The application's own databaseDBOS, Marten, effect-workflow, akka
The platform's storage runtimecloudflare, azure, dapr, Golem, Netherite, Orleans
Local filesvercel (development world)

Milestones ​

Dates are those of the cited publication or release, verified on the linked page.

YearMilestone
1987Sagas defines compensation and backward recovery for long-lived transactions
1992ARIES fixes the write-ahead protocol, "repeating history", and compensation log records
2005Compensation calculi give compensable processes a trace semantics and the LIFO law
2006Termite Scheme ships serializable continuations for process migration (replay-vs-snapshot)
2007Helland argues at CIDR that distributed transactions must be replaced by idempotent activities
2009Building on Quicksand reframes compensation as apology (calculi)
2011Cloud Haskell shows arbitrary closures cannot be serialized, only static labels (replay-vs-snapshot)
2013Ramalingam and Vaswani prove fault tolerance via idempotence for a replayed effect log (handlers)
2017rr makes whole-process record and replay deployable on commodity hardware
2018Pyro's poutine ships the trace/replay handler pair — the mechanism, without persistence (handlers)
2021Burckhardt et al. give durable functions a formal semantics and prove replay equivalent to direct execution
2021FoundationDB's simulation testing is published with the SIGMOD paper
2022Netherite shows a partitioned event-sourced engine beating per-step storage round trips
2025Cloudflare Workflows reaches general availability, putting step.do on an edge runtime

Suggested reading paths ​

"I want the shortest honest summary." Concepts, then Comparison.

"I am designing the sparkles durable layer." Comparison (especially its delta table and the closing "Questions for the sparkles design"), then ARIES and Helland for the journal-versus- world problem, then Sagas and the calculi for compensation, then Golem for the one serious answer to versioning, and Resonate for the testing bar to clear.

"I want the formal ground." Burckhardt et al., then handlers for what the effects literature does and does not have, then Netherite for the engineering the semantics permits.

"I want to see it work." The runnable replay-journal example: about 200 lines of D that journal a miniature release, crash at every index, resume, and detect a diverged program. ci --example-files compiles and runs it.

"I want the closest prior art to what we are building."effect-workflow (the design this was sketched from), Restate (the closest journal shape), and DBOS (the closest deployment shape — a library over a database, no server).


Sources ​

Each deep-dive carries its own primary citations: 430-plus GitHub file references, every one pinned to a commit hash and verified to resolve, plus the papers and official documentation listed on each page. The catalog reads upstream source trees cloned under $REPOS at the revisions its metadata tables name.