CORE CAPABILITY

How to move a system that cannot stop

"We'll cut over in one weekend" usually collapses on Monday morning. We shift traffic gradually and keep every step reversible.

Discuss a migration

The strangler pattern

A routing layer sits in front of the legacy system, and newly built features are served by the new system while everything else continues to hit the old one. That state is held for months while features move across one by one, and the legacy system is retired when the last one lands.

The point of this approach is that it is always reversible. If the new system misbehaves you revert the routing. A big-bang cutover has no such option.

Prerequisites

Three things are always settled before the first move.

  • Data ownership — which system may write to which tables. Once both systems write to the same table, reversal is gone.
  • Session and identity — both systems must recognise the same session, or users get logged out mid-migration.
  • Observability — during migration you must be able to tell which side served a request. Distributed tracing goes in first.

Data migration

Data moves before the code and more slowly than the code: dual write, a verification window, reads switched over, and only then legacy writes turned off. Each step has a written rollback procedure that we actually rehearse.

A typical migration

  1. 2025 04

    Phase 5 — Legacy retired

    After the final feature moves, the legacy system stays read-only for a quarter and is then shut down.

  2. 2024 11

    Phase 4 — Dual write and verification

    Both stores are written and compared. Reads do not move until the mismatch count reaches zero.

  3. 2024 07

    Phase 3 — First feature moved

    The least-coupled feature goes first. Its purpose is to validate the procedure, not to deliver value.

  4. 2024 05

    Phase 2 — Routing layer

    A gateway is placed in front of the legacy system passing everything straight through. Nothing should behave differently yet.

  5. 2024 03

    Phase 1 — Observability first

    Distributed tracing and structured logging go in before anything moves. Migrating blind makes root cause unfindable.

  6. 2024 01

    Phase 0 — Survey and boundaries

    Code and data dependencies are measured. The documented structure and the real call graph almost never match.

Delivered alongside

  • Containerisation

    Runtime versions pinned and images minimised. Clearing base image vulnerabilities is cheapest during the move.

  • DevSecOps pipeline

    Dependency scanning and SBOM generation added to the build. Gates start as warnings, not as blocks.

  • Performance budgets

    Before and after measured the same way. Numbers, not impressions, end the argument.

Want a second opinion on your migration plan?

Send us the plan you already have and we will point at the risky segments.

Get in touch