The software world loves a good pendulum swing. A decade ago, microservices were the shiny new hammer, and every problem suddenly looked like a nail. Teams rushed to carve monoliths into dozens—sometimes hundreds—of bite-size services, convinced this was the only path to speed and scale. Fast-forward to 2025 and we’re Rethinking Microservices: When Monoliths Make a Comeback is the headline popping up in conference talks, tech blogs, and even internal architecture review boards. Why? Because big names such as Amazon Prime Video publicly admit they saved money and simplified life by rolling one of their microservice clusters back into a single deployable unit—without losing performance.

This article digs into the why and the how:
- Why microservices became the default—and where the cracks appeared
- What a modular monolith (sometimes called a “modulith”) looks like in practice
- Decision frameworks for choosing the right service granularity
- Patterns that blend the best of both worlds—bounded-context services, self-contained systems, and plug-in architectures
- Real-world signals that it might be time to rein things in
Expect practical advice, a little humor, and plenty of lessons learned from the trenches.
The Microservices Boom: How We Got Here
When Netflix wrote that famous 2014 blog post about breaking their video service into cloud-native microservices on AWS, the industry cheered. The architecture promised:
- Independent deployment pipelines so teams could ship faster
- Fault isolation so one bad component wouldn’t topple the whole stack
- Freedom for each squad to pick the “right tool for the job”—Java here, Go there, maybe Node.js for that new API
Those promises were mostly real. They still are. The trouble is that the positives can get drowned out by side-effects when an organization scales beyond a certain point—or when many services aren’t really justified.
Hidden Costs Behind the Hype
- Operational Overhead: Every microservice needs CI/CD, monitoring, alerting, secrets rotation, IAM policies, cost tracking, you name it. Stack that 30, 40, or 400 times and your platform team cries uncle.
- Network Tax: Latency-sensitive surfaces (think real-time video) struggle once a synchronous call hops across five internal hops.
- Data Consistency Puzzles: Distributed transactions are tough; idempotency, retries, and sagas multiply.
- Developer Cognitive Load: A new hire opening the repo sees a zoo of tiny apps—each with its own tech stack, branch strategy, and code style guide. On-boarding drags from days to weeks.
- Cloud Spend: Each container demands baseline memory/CPU. Add service mesh proxies, load balancers, and tracing sidecars… the bill balloons.
Microservices aren’t bad, but they’re not free. When Amazon’s Prime Video team published that famous migration blog, they reported a 90 % cost drop plus easier debugging once they merged a “too chatty” group of services into a single process.
Rethinking Microservices in 2025
A growing chorus of architects is asking, “What if we dial back the fragmentation?” Enter the era of Rethinking Microservices—an honest reassessment instead of dogma. The guiding principle: Use the smallest number of deployable units that still deliver agility and reliability.
What Exactly Is a Modular Monolith?

Picture a classic monolith: one big codebase, one database, deployments that require coordination among dozens of dev teams. Now modernize it:
- Strict Internal Boundaries: Each domain lives in its own folder/module, exposing only public interfaces. The compiler (or linter) prevents cross-module reach-ins.
- Independent Feature Flags: Even if modules ship together, you can toggle features on/off individually.
- Domain-Driven Design: Teams own bounded contexts inside the monolith—shipping cohesive features without stepping on each other’s toes.
- Horizontal Scalability: Container images can still autoscale; the difference is that you scale one binary, not fifty.
- Automated Tests & Pipelines: The build runs per-module test suites in parallel, cutting feedback loops.
- Observability at Module Boundaries: You still get metrics and traces for each domain to pinpoint hot spots.
Think of it as a monolith with microservice discipline—Cleaner, faster, but without the network tax.
Monoliths Make a Comeback: How to Spot the Opportunity
Several trigger points hint that a monolith-style consolidation might help:
- Chatty Calls: If half of your p99 latency is internal gRPC calls, consider collocating those services.
- Exploding CI/CD: Are you running hundreds of nearly identical pipelines? Do deploys take longer to orchestrate than to run code?
- Team Confusion: Junior devs need a 40-page doc just to spin up a dev environment.
- Cost Surprises: Cloud invoices show 30 % in east-west traffic or idle container memory.
- Cross-Cutting Features: A new feature spans four microservices, each needing schema updates, migrations, and releases. That’s expensive coordination overhead.
When two or more triggers fire, schedule an architecture “reset” workshop. List your services, the calls between them, and the data they own. Very often you’ll find natural groupings screaming to become a single deployable unit.
Choosing Service Granularity: A 5-Question Checklist
- Change Frequency: Does this component often evolve on a different schedule? If yes, separate service may be justified.
- Team Autonomy: Is there a dedicated team that needs to own it end-to-end? If yes, split.
- Criticality & Blast Radius: Will a bug here crash everything? If yes, isolation helps.
- Data Coupling: Do two services share tables or tight data contracts? If yes, merge or redesign.
- Runtime Profile: Does it demand unique scaling (GPU, high memory, real-time)? If yes, dedicated service.
Answer “yes” to two or more, you likely keep it separate. Otherwise, consider folding it into a modular monolith or a bounded-context composite.
Middle-Ground Patterns: Moduliths, Bounded-Context Services, Self-Contained Systems
Moduliths
Coined by Spring’s Oliver Drotbohm, the term “modulith” means a monolith with an opinionated module system—think Java modules or .NET assemblies—plus architectural testing to enforce clean boundaries.
- Pros: Zero network latency between modules, single deployment, still enforces strong separation.
- Cons: One repo can get gnarly if discipline slips.
Bounded-Context Services
Align microservices strictly to domain-driven design contexts: payments, recommendations, user profile. No more splitting user profile into five microservices.
- Pros: Each context is cohesive. Teams communicate via well-defined events or APIs.
- Cons: Requires deep domain modeling and strong ownership culture.
Self-Contained Systems
Each slice (web UI + API + storage) lives in its own repo and can be deployed/rolled back independently, but slices talk via messages, not synchronous calls. Good for slice-based workloads like e-commerce.
Migration Stories: What Success Looks Like
Amazon Prime Video: Reunified a graph of microservices that handled stream manipulation. Result: 90 % cost-drop, fewer ColdStart glitches.
Segment: The analytics company merged 45 microservices into one Golang monolith, cutting deploy time from 60 minutes down to 5 and halving AWS costs.
Thoughtworks Client X: A financial services firm used modulith + DDD to consolidate 80 services into 12 contexts, reducing cross-team incidents by 40 %.
Each story shares a pattern: start with a service graph audit, merge the most chatty, then chip away iteratively. Retain proven microservices where they truly add value (authentication, data pipelines, heavy compute tasks).
Human Side: Culture, Tooling, and Mindset
Moving from “microservices first” to “right-sized services” is mostly about mindset. You’ll need:
- Strong automated tests: A bigger codebase can’t rely on manual QA.
- Clear internal APIs: Even in a monolith, modules communicate via interfaces, not random imports.
- Observability Discipline: Logs and traces must attribute latency to modules; otherwise, debugging devolves into guesswork.
- Shared Coding Standards: Agree on language versions, code style, dependency rules.
- Product-centric Teams: Own a business outcome, not just a microservice.
Adopt these and your newly trimmed architecture will feel nimble, not stodgy.
Rethinking Microservices: When Monoliths Make a Comeback in the Cloud Cost Era
We promised we’d slide the article’s title into the text again, so here goes: Rethinking Microservices: When Monoliths Make a Comeback is more than a catchy phrase—it’s a survival guide for organizations waking up to ballooning bills and runaway complexity. In a cloud-cost era, doing more with fewer deployables means real dollars saved and happier engineers.
FAQs
Why are companies reversing microservice migrations?
Because hidden cost and complexity sometimes outweigh the agility microservices promised.
Is a monolith always cheaper to run?
Often, yes—fewer network hops, fewer containers, and less overhead mean lower bills.
What toolchain helps enforce modular boundaries inside a monolith?
Static-analysis rules, package-level visibilities, architecture tests (ArchUnit, jDepend), and module systems.
Can I keep some microservices and merge others?
Absolutely. Hybrid architectures—some bounded-context services plus a core monolith—are common.
Does switching back hurt team autonomy?
Not if you keep domain ownership clear; modules can offer as much autonomy as separate services.
Conclusion
Whether you’re in fintech, video streaming, or enterprise SaaS, questioning default patterns is healthy. The point isn’t to declare microservices dead but to right-size your architecture. Sometimes that means collapsing a constellation into a brighter, simpler star—a modular monolith. Other times it means carving only the truly independent domains into microservices. In 2025 flexibility is king, and the smartest teams wield both approaches with nuance and data, not dogma.