Alex66

Alex66

Running an FBP pipeline where each node is a GenServer. Need to move a segment of the running pipeline (multiple connected nodes) from one BEAM node to another without losing messages or breaking the flow.

Example: nodes A → B → C → D running on server 1. Want to move B → C to server 2 while pipeline is processing.

Questions:

  1. Drain and restart, or something smarter?

  2. How to handle in-flight messages during migration?

  3. Coordinate the cutover so upstream (A) starts sending to new location?

  4. Is there a pattern for this, or just stop/migrate/restart?

Using Pulsar/Artemis as message broker, so could potentially buffer there during migration. But curious about pure BEAM approaches too (mailbox draining, etc).

Showing Posts 1 to 3

allen-munsch

allen-munsch

I haven’t done this using FBP, or BEAM. So I am drawing my answer from my experience in just database migrations ( postgres ) from one cloud to another with near zero downtime ( very little buffered draining )

The way I have done something similar in the past was via WAL streaming both with a timed syncronization window where queries timed out for a small bit while the buffers drained over.

Proxy stream original B → C to the 2nd B → C

verify 2nd B matches 1st B, then stop sending to 1st B

Kinda like: Blue–green deployment - Wikipedia

Someone told me once it’s a combination of the 2, a Cyan deployment.

If it’s okay to take it offline for maintenance for an hour or 2, that’d be easiest, just imo

manhvu

manhvu

In this case, you can use hot code reloading for the GenServer , update its state in the code_change/3 callback, and route requests to the new node.

Alex66

Alex66 OP

Thanks everyone for the input! Wanted to share what I ended up implementing.

Already had:

  • Remote Output / Remote Input nodes for cross-BEAM communication

  • Circuit breaker with message buffering when target unavailable

  • Auto-recovery when connection restored

What I added:

  • Runtime pipeline modification (add/remove nodes while running)

  • Runtime property injection (change node config without restart)

  • Dynamic connection changes (rewire targets mid-flow)

The migration approach:

  1. Circuit break at the split point (Remote Output buffers messages)

  2. Send pipeline segment config (JSON) to target server

  3. Start the segment on new server

  4. Update Remote Output’s target channel at runtime

  5. Buffer drains to new location

Nodes are stateless transformations — state lives in the message flow. So “hot migration” is just runtime topology modification.

Appreciate the discussion!

— All posts loaded —

Where Next? Top

Trending in Questions Top

katta
I having some trouble figuring out if I have set myself too strict of standards for my production server. Currently I can handle 75% of r...
New
achenet
Hello, I’m trying to build a basic Phoenix web-app, and I’d like to use Tailwind. However, when I launch mix phx.server, I get an error...
New
Cxx-mlr
I’m working on a small exercise involving update_in/3, and I came up with this solution: data = %{ name: "Periodic Table", category:...
New
ChrisAmelia
I’ve got trouble wrapping my head around the order in which functions are called in this snippet (from Phoenix’s authentication): toke...
New
dillonoconnor
Is there any way to avoid the Hologram compiler running when using iex? It seems like the front-end code could potentially be disregarded...
New
unaware8150
Hello folks! So at work, we are seeing some situations where we have to define some “fixed” strings that are used across the codebase in...
New
thiagogsr
** (ArgumentError) expected :max_attempts to be a positive integer, got: {:@, [line: 10, column: 19], [{:max_attempts, [line: 10, column:...
New

Other Trending Topics Top

GenericJam
Edit: 2026 May 15 - This post is archived. Mob is alive!! Main docs: mob v0.7.11 — Documentation A bit of explanation for the slightly c...
New
mudasobwa
I am happy to introduce the very α version of the new programming language compiled to BEAM. Welcome Cure. It has literally three kille...
New
garrison
Hobbes is a low-level distributed database for the Elixir programming language. Hobbes provides a simple, safe, and scalable storage lay...
New
budgie
A little off-topic, but I feel like people here have a good head on their shoulders. I used to be quite good at making software. Was luc...
New
KristerV
Hey. Is there anyone here who creates agents in their apps? Not talking about using agents, but creating them. I’m finding it pretty diff...
New
mcass19
ExRatatui lets you cook up rich terminal UIs in Elixir, powered by Rust’s ratatui via Rustler NIFs. Build interactive terminal applicatio...
New

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews