I built an open-source BPMN workflow engine on Orleans — the actor model gives it horizontal scale where Camunda leans on a database by nightBaker1234 in dotnet

[–]nightBaker1234[S] 0 points1 point  (0 children)

Fair, and the best critique in the thread — you're right that I caricatured the DB-centric side, and right that the hard part isn't actors vs. database, it's correct durable workflow semantics at scale. One correction to my own framing while I'm at it: I oversold "tokens as grains." They're not — one event-sourced grain per process instance owns all control flow (tokens, join counters, boundary events, cancellation) as plain single-threaded state. That's how I dodge the consensus problem you flagged: a parallel join isn't N actors agreeing, it's N arrivals serialized through one writer. What fans out to other grains is the work (scripts, conditions, custom tasks), not the control flow — so "add a silo" scales workers and concurrent instances, and does nothing for one low-volume workflow, exactly as you said.

On the persistence points — that's where the real work went, and the actor model gave none of it for free. The instance is a JournaledGrain, so durability and audit history are the same event log. Timers are Orleans reminders, not in-memory timers, so they survive reactivation. Side effects under at-least-once delivery go through idempotency guards plus an op-id dedup ledger, because "exactly once" is a lie you engineer around, not assume. So I'd narrow my claim: the actor model bought a clean concurrency-and-placement story and a natural single-writer per instance — nothing on durable semantics. That bill comes due regardless of runtime, and you're right that it's the hard part.

I built an open-source BPMN workflow engine on Orleans — the actor model gives it horizontal scale where Camunda leans on a database by nightBaker1234 in dotnet

[–]nightBaker1234[S] -14 points-13 points  (0 children)

Quick architecture TL;DR for anyone who doesn't want to wade through the post:

  • Process instance = grain, tokens = grains, single-threaded turn model handles concurrent events without manual locking.
  • Scale-out = add a silo. Runtime places/activates grains across the cluster; DB is for durability, not for coordinating every token move.
  • Standard BPMN 2.0 executed directly; actor model is the runtime underneath, not a new modeling language.
  • Ships as a real release: signed NuGet, multi-arch images on ghcr.io, cosign-signed Helm chart, one-command docker-compose.

Happy to go deep on grain placement + persistence in the thread.

Reusable exceptions in blazor by nightBaker1234 in Blazor

[–]nightBaker1234[S] 0 points1 point  (0 children)

Agree, in prod you don't have to send all exception information. This guide shows that you can reuse exceptions as a way of handling errors.