The Problem: A 15-Year Monolith
Our client — a regional private bank — ran all core operations on a single Oracle-backed Java monolith deployed on bare-metal servers. Releasing any feature required a full regression test cycle of 6 weeks. The team could ship once per quarter. Meanwhile, challenger banks were shipping 50+ releases per week.
The Strangler-Fig Pattern
Rather than attempting a "big-bang" rewrite — which has a failure rate exceeding 70% — we applied the Strangler-Fig Pattern: incrementally extracting bounded contexts into independent microservices while keeping the monolith operational throughout.
Phase 1: Event Stream Introduction (Weeks 1–8)
We introduced Apache Kafka as the system of record for all transaction events. The monolith was instrumented to publish domain events to Kafka topics alongside its existing database writes. New microservices consumed from these topics, building their own read models independently.
Phase 2: Bounded Context Extraction (Weeks 9–24)
We identified 7 bounded contexts with the most change frequency: Account Management, Payment Processing, KYC/AML, Notifications, Reporting, Loan Origination, and Fraud Detection. Each was extracted as an independent service with its own PostgreSQL database, deployed via Kubernetes.
Phase 3: Traffic Migration (Weeks 25–32)
New traffic was gradually routed to microservices via a feature-flag-controlled API gateway. We migrated 1% → 10% → 50% → 100% over 8 weeks with automated regression comparisons at each stage.
Results
| Metric | Before | After (12 months) |
|---|---|---|
| Release frequency | 1 per quarter | Daily deployments per service |
| Deployment lead time | 6 weeks | Under 2 hours |
| System availability | 99.1% | 99.97% |
| Infrastructure cost | Baseline | 38% reduction |