Problem: 18 months of no features to clean up technical debt was competitively unacceptable. Monolith behaviour partially undocumented — a full rewrite risked missing business logic. 6-week average feature cycle time.
Solution: Nginx location block proxy in front of the monolith routes specific paths to the new Go service. Module extraction in 3 sprints: Sprint 1 — build Go service matching monolith response schema. Sprint 2 — dark traffic parallel run, automatic response comparison, alert on divergence. Sprint 3 — promote Go service to primary, monolith as fallback, retire after 2-week clean period. Repeated for 9 modules over 14 months.
Technology: Go · PHP · nginx · Postgres · Docker · GitHub Actions
Optimisation pattern: big-bang-rewrite-rejection-to-nginx-proxy-strangler-with-dark-traffic-parity
Outcomes:
Feature cycle: 6 weeks → 2 weeks. Monolith size reduced 67%. Zero customer-visible incidents during any extraction — parallel run caught 3 behavioural divergences before promotion. Engineer satisfaction significantly improved.