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:
-
Drain and restart, or something smarter?
-
How to handle in-flight messages during migration?
-
Coordinate the cutover so upstream (A) starts sending to new location?
-
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).
Trending in Questions
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
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
I’m working on a small exercise involving update_in/3, and I came up with this solution:
data = %{
name: "Periodic Table",
category:...
New
I’ve got trouble wrapping my head around the order in which functions are called in this snippet (from Phoenix’s authentication):
toke...
New
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
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
** (ArgumentError) expected :max_attempts to be a positive integer, got: {:@, [line: 10, column: 19], [{:max_attempts, [line: 10, column:...
New
Other Trending Topics
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
I am happy to introduce the very α version of the new programming language compiled to BEAM.
Welcome Cure.
It has literally three kille...
New
Hobbes is a low-level distributed database for the Elixir programming language.
Hobbes provides a simple, safe, and scalable storage lay...
New
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
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
ExRatatui lets you cook up rich terminal UIs in Elixir, powered by Rust’s ratatui via Rustler NIFs. Build interactive terminal applicatio...
New
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #library
- #deployment
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #elixirconf
- #channels
- #exunit
- #discussion
- #code-sync
- #podcasts
- #javascript
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ai
- #ecto-query
- #elixirconf-us
- #blog-post
- #elixir-ls
- #phoenix_html
- #iex
- #graphql
- #genstage
- #websockets
- #supervisor
- #advent-of-code
- #distillery
- #processes
- #elixirconf-eu
- #api
- #forms
- #metaprogramming
- #hex











Showing Posts 1 to 3- Show Best Posts
- Show All (oldest first)
- Show All (newest first)
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
In this case, you can use hot code reloading for the
GenServer, update its state in thecode_change/3callback, and route requests to the new node.Alex66
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:
Circuit break at the split point (Remote Output buffers messages)
Send pipeline segment config (JSON) to target server
Start the segment on new server
Update Remote Output’s target channel at runtime
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!