Go-Native Durable Execution

Go workflows that “feel like Go” spark a brawl over Temporal, DIY tools, and the new kids

TLDR: A Go blog touts a “feels-like-Go” workflow system using built-in context to make long jobs reliable and cancellable. Comments erupted into a tool war—Temporal skeptics, DIY builders, and fans of Restate, go-workflows, and Dapr—asking for proof it’s simpler and worth switching.

A new blog pitches a Go-native way to run long, multi-step jobs reliably using a beefed-up “durable” context—think: timers, cancel buttons, and type-checked steps, all wrapped to look and feel like normal Go. Sounds chill… until the comments turned into a showdown. One camp cheered the promise of fewer surprises than Python-based tools and compile-time safety. Another accused the post of acting like the giant in the room—Temporal—doesn’t exist, with one user slamming its “egregious overhead.” The thread quickly became a shopping aisle of alternatives: someone’s building their own “DagGo,” another asked how it compares to go-workflows, while others swore by Restate after pitting it against Temporal, Hatchet, and DBOS, and a separate crew waved the flag for Dapr’s durabletask-go. The mood? Curious but combative—fans of “simple, Go-y” workflows vs. skeptics who’ve seen this movie before. Memes and quips flew about “not another workflow engine” and “context all the way down,” as the community turned a technical explainer into a face-off over what actually works in production. Verdict: the idea lands, but the crowd wants receipts, benchmarks, and a clear reason to switch.

Key Points

  • The library extends Go’s context.Context into durable.Context to enable durable workflow execution and metadata propagation.
  • Two methods—RunWorkflow and RunAsStep—let developers run standard Go functions as workflows and steps with state checkpointing.
  • RunWorkflow launches workflow functions in a goroutine and creates a child durable.Context seeded with workflow metadata.
  • Deadlines and cancellation are integrated: durable.WithTimeout sets timeouts; RunWorkflow uses Deadline and registers AfterFunc to mark cancellation durably.
  • Cancellation is cooperative, not preemptive; step execution checks for cancellation before running to respect context signals.

Hottest takes

"Been eager for something that wasn’t temporal (egregious overhead and annoying multiple services)" — dangoodmanUT
"After spending way too much time debugging runtime problems with python based workflow tools" — barelysapient
"We chose this internally after evaluating it against temporal, hatchet, and dbos" — erdaniels
Made with <3 by @siedrix and @shesho from CDMX. Powered by Forge&Hive.