Monoliths Are Making a Comeback—Here's Why


For years, tech teams chased microservices as the "right" architecture, lured by promises of unlimited scale and team autonomy. But today, reality has set in—many companies are quietly returning to monoliths, and for good reason.
From Java-heavy enterprises to fast-moving startups, engineering leaders are realizing that premature distribution often hurts more than helps. Let's explore why—and when—monoliths are regaining favor.
1. The Microservices Hangover: Costs Outweigh Benefits for Most
The Business Reality
60-70% of microservices adopters report higher-than-expected operational costs (recent industry surveys)
Small to mid-sized teams (5-20 engineers) spend 30-50% of their time on cross-service coordination rather than features
Cloud bills explode with hundreds of services (each needing compute, monitoring, and networking)
The Technical Trade-offs
While microservices solve true scaling bottlenecks, they introduce:
Network latency (even with gRPC, ~2-5ms per call)
Debugging nightmares (distributed tracing is still hard)
Data consistency headaches (sagas, eventual consistency)
// What used to be a simple Java method call...
public Order processOrder(OrderRequest request) {
inventoryService.reserveItems(request); // Network hop
paymentService.charge(request); // Another network hop
// Now needs complex orchestration
}
Key insight: If your entire system fits in a single JVM, why distribute it prematurely?
2. Why Monoliths Are Winning Today
The Speed Advantage
Faster iterations: Single codebase = no cross-service coordination
Simpler testing: No need for contract testing or mock services
Easier hiring: Junior devs contribute faster without distributed systems expertise
The Cost Savings
Cost Factor | Monolith (Java/Spring) | Microservices (Java + Kubernetes) |
Cloud Compute | $3K/month | $15K/month (+5x) |
DevOps Effort | 1 engineer | 3+ engineers |
Mean Time to Repair | 30 minutes | 2+ hours |
Case Study: A 50-engineer fintech startup achieved massive savings by consolidating microservices into a modular Spring Boot monolith, mirroring the experience shared in Segment's Goodbye Microservices post. While their exact savings weren't disclosed, they reported:
3-6x faster feature development
90% reduction in deployment complexity
Significant infrastructure cost reductions
Similar success stories:
The Scale Myth Debunked
Monoliths can handle 100K+ RPM with modern JVMs (GraalVM, latest Java LTS)
Vertical scaling is cheaper than ever (cloud instances with 256GB+ RAM)
True scaling bottlenecks are rare—most apps never outgrow a monolith
3. The New Best Practice: "Majestic Monoliths"
What's Changed Recently?
Better modularity (Java modules, Spring Modulith)
Smarter decomposition (extract only proven bottlenecks)
Hybrid approaches (monolith + a few critical services)
How to Structure a Modern Monolith
com.yourcompany
├── order (module)
├── payment (module)
├── inventory (module)
└── shared (minimal!)
Key principles:
Enforce module boundaries (Java 9+ modules, ArchUnit)
Use domain events (Kafka, not HTTP calls) for future extraction
Start monolithic, then peel off only what needs to scale independently
4. When Microservices Still Make Sense
The 20% Where Distribution Wins
✅ True scaling needs (e.g., payment processing at Stripe volumes)
✅ Regulatory isolation (PCI-compliant services)
✅ Polyglot requirements (Python for ML, Rust for high-throughput)
Anti-patterns to avoid:
❌ Splitting because "microservices are modern"
❌ Giving each team their own service (coordination hell)
❌ Premature optimization (most apps never hit these scales)
5. The Modern Decision Framework
Choose Monolith If:
Your team is < 50 engineers
Your QPS is < 50K requests/minute
You value speed over theoretical scale
Choose Microservices If:
You're at hyperscale (or need to be)
You have clear domain boundaries (Amazon's "two-pizza rule")
You measured a true bottleneck
The Bottom Line
The industry is maturing. Today, smart teams choose monoliths first, then distribute only what's proven to need it.
Your move:
Audit your microservices costs (engineer hours + cloud spend)
Consider a modular monolith (Spring Modulith, Java modules)
Extract services only when metrics demand it
Agree? Disagree? Share your war stories below.
Subscribe to my newsletter
Read articles from Eduardo Andrade directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by

Eduardo Andrade
Eduardo Andrade
🚀 Java Developer with 18 Years of Passionate Expertise 🌐 Hello, fellow tech enthusiasts! 👋 I'm Eduardo, a seasoned Java developer with a rich tapestry of 18 years in the realm of software development and architecture. 🖥️ Crafting Code, Weaving Architectures: My journey involves seamlessly blending development and architectural intricacies. From coding to crafting robust architectures, I've been navigating the ever-evolving tech landscape. 📚 Eternal Learner at Heart: A perpetual student, I find sheer joy in unraveling new technologies. The thrill of learning fuels my passion for staying at the forefront of industry trends. 💡 Current Exploration Zones: While Java remains a steadfast companion, my current interests gravitate toward the realms of Go programming, cloud computing, microservices, and APIs. Exploring the possibilities of these cutting-edge technologies keeps the flames of curiosity burning bright.