Production report: one month running a durable message bus + tmux worker orchestration (follow-up to #1493) #1928
badosanjos
started this conversation in
General
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
(Follow-up to #1493, which closed before I could share this — posting as a new thread so it's findable. Context: in that thread @stratofax described an ntfy-based private message bus, and I commented about our filesystem-NDJSON variant. This is the one-month production report.)
First some context on the architecture, since last time I only described the bus itself.
The architecture (5 layers):
tail -fis a debugger.A month in, what held up: the durable bus survived a real VM restart with zero loss (moved off
/tmpearly — do this on day one). Splitting the human-facing queue into decision / FYI / parked lanes killed head-of-line blocking (one pending decision once jammed everything for 19 hours). And session pinning turned disaster recovery into routine: an OOM killed 7 concurrent sessions mid-work and every one came back with--resume <uuid>, full context.What didn't: "ok: true" is not consumption — a worker sat blocked 3 hours because a TUI hijacked its pane while my answer-write "succeeded"; we now verify cursor movement, not delivery. Detection layers breed their own bugs (every incident spawned a detector, then a detector for the detectors) — the root cause was three state stores (bus, registry, issues) that could disagree, and the fix is making the registry a pure projection of the event log. And message durability ≠ work durability: when a parent session dies, its children are connected only by a label, not an edge. We benchmarked ~200 projects this week; conclusion was don't migrate (nothing out there supervises an interactive CLI in tmux), but steal three ideas — parent→child edges at spawn (Temporal's
ParentClosePolicy, OTP's links), heartbeat-with-payload instead of poll-based detectors, and state-as-projection-of-log.~80 workers through the bus so far, a dozen concurrent sessions at peak, one VM, voice as the main interface most of the day. Happy to go deeper on the lanes design, the session-pinning, or the Pulse wiring if useful.
All reactions