The strangler pattern, in practice
Replacing a system that cannot stop running is mostly about routing and reconciliation. The rewrite is the easy half.
Every legacy replacement starts with the same proposal: build the new one, run them in parallel briefly, then switch. It almost never survives contact with a business that operates twenty-four hours a day and cannot pause dispatch for a weekend.
The strangler pattern replaces the big switch with many small ones. A routing layer sits in front of both systems and decides, per request or per region or per customer, which one handles it. You move traffic across in slices and the old system shrinks until it is empty.
The routing layer is the whole trick, and it needs to be dull. A feature flag per slice, changeable without a deploy, with the old path still warm. Rollback is a flag flip, which means the decision to move a slice stops being a career risk and starts being a Tuesday.
Reconciliation is the part teams skip. While both systems are live you must compare their outputs continuously — same inputs, same results — and alert on divergence with enough detail to act. On a freight platform this caught a rounding difference in fuel surcharge that would have been invisible until the month-end invoice.
The awkward truth is that you will run two systems for longer than planned, and someone has to own the discipline of finishing. The failure mode is not a failed migration; it is a permanent hybrid that nobody dares complete because the last ten percent is the hard part.
Done properly the result is anticlimactic. On the platform above, cutover took zero hours of downtime, because there was never a moment where anything was switched on. The last region simply moved and the old database stopped receiving traffic.