Coordination was too expensive
Some features required several pull requests, sequenced releases, and inter-service contracts to watch.
Case study
A four-developer team was maintaining seven microservices, several pipelines, a broker, and more coordination than the traffic and organization justified.
The engagement turned a disproportionate distributed architecture into an operable modular monolith: one CI flow, one deployable backend, frontend assets served by the backend, and a progressive migration without a big bang.
Context
The microservices choice had been made before the product, traffic, and organization justified it. Each feature crossed several services, logs, pipelines, and environment-variable sets.
Some features required several pull requests, sequenced releases, and inter-service contracts to watch.
With staging, UAT, and production, the 3-pod minimum per service multiplied cost and operations.
The product was live. The target had to be reached without a freeze, without a big bang, and with a clear rollback path.
Decisions
The point was not to reject microservices. The point was to put distribution at the right level for the team size and product constraints.
Existing HTTP prefixes became the migration unit. A route could move to a local handler without changing its external interface.
Each switch was protected by a feature flag: local traffic when enabled, external service when disabled.
The target was a modular monolith, not an opaque block. Business responsibilities still had to be readable in code.
The frontend was served as static assets from the backend, with one CI flow and one artifact to operate.
Delivery
The path let the team keep shipping during the transformation. The work combined architecture, implementation, operations, and decommissioning.
Service logic was brought into the main application behind the same HTTP interface.
The flag made it possible to test in production, observe, then make the switch permanent.
Once stable, the network call was removed, the queue drained, and the service retired.
Impact
The main effect was removing a distributed-systems tax the organization did not recover through autonomy or scaling.
Stack
The value did not come from one technology. It came from aligning application architecture, runtime, and delivery.
Lesson
A distributed system is justified when it solves a real organizational, scaling, or isolation problem. Otherwise it turns every feature into unnecessary coordination.