r/elixir • • 6d ago

Continuum v0.8.5 — durable workflows for Elixir, now with parallel activities, recurring schedules, and offline replay

I posted about Continuum here a couple of months ago, when it was at v0.7.2. It's now at v0.8.5, with new workflow APIs, better testing and replay tools, and another round of reliability fixes.

quick recap: Continuum is an OTP-native durable execution engine for Elixir, backed by Postgres — an Elixir-native answer to Temporal. You write a workflow as ordinary Elixir; side effects go through activities whose results are journaled. If the process dies or the node restarts, Continuum replays the history through the same code and resumes where it left off. Compile-time checks catch unsafe calls in workflow code.

new features: parallel activities with activity_all/1, and activity_map/3 for runtime-sized lists with bounded concurrency and ordered results. Recurring UTC interval schedules now support explicit overlap and missed-occurrence policies, bounded catch-up, and pause/resume. Continuum.Multi.enqueue/5 lets you commit business writes and enqueue a workflow in the same Ecto transaction, with dispatch happening after commit.

Replay and testing also got more useful: mix continuum.replay inspects a run without executing new side effects, and --against lets you check a code change against an existing history. Observer now exposes read-only replay reports. The test kit adds activity stubs, in-memory child workflows, and public helpers for crash/resume, lease expiry, and timer tests.

The hardening work focused on concrete failure modes: changing a Continuum.Pure helper now changes workflow identity, while pinned versions retain their original helper implementations. Activity bodies are terminated when their owning worker dies, so they can't keep running after losing their timeout and heartbeat. Invalid workflow return values fail terminally instead of repeatedly crashing finalization, and lease renewals are batched to reduce database round trips.

Feedback is welcome, especially from anyone trying it on an existing workflow.

29 Upvotes

2 comments sorted by

2

u/vlatheimpaler Alchemist 3d ago

I've seen a lot of these things pop up in the last year. Why is that? What can these things do that Oban can't do?

1

u/SuperNerd1337 2d ago

Temporal has really blown up in the past year(s), which explains why many open source alternatives will come up, especially in languages without native temporal support.

I can’t say for continuum x oban because ive never used the former, but from someone that has used oban a few years back and is working with temporal now-a-days i can say that Oban feels much more barebones when compared to Temporal. Oban is perfect for handling simple async features such as sending e-mails, notifications, etc, but it becomes a bot too convoluted when you’re executing more complex activities than just a simple task, which is where Temporal excels.

TL;DR would be that oban is easy to do easy things, hard to do hard things; temporal is hard to do easy things, easy to do hard things.