Skip to content
Supra Builds

When Microservices Are Wrong: A Solutions Architect's Decision Framework

A decision framework with real cost data, case studies, and a readiness checklist to help you choose the right architecture.

้ปƒๅฐ้ปƒ

้ปƒๅฐ้ปƒ

· 12 min read

When Microservices Are Wrong: A Solutions Architect's Decision Framework

I've been that architect. The one who spun up AWS Lambda functions and ECS clusters for every new service, convinced that microservices were the only "proper" way to build modern software. After years of managing distributed complexity โ€” and eventually migrating most of my projects to Next.js, NestJS, Vercel, Railway, and Supabase โ€” I learned something the hard way: the best architecture is the one that matches your actual needs, not your aspirations.

Across the industry, a growing number of organizations are consolidating their microservices back into simpler architectures. This isn't a step backward โ€” it's the industry maturing. The microservices hype cycle has peaked, and we're finally having honest conversations about when distributed systems create more problems than they solve.

This article gives you a practical decision framework โ€” backed by real cost data, case studies, and a ready-to-use checklist โ€” so you can make architecture decisions based on evidence, not hype.


The Microservices Hype Cycle: Where We Stand in 2026

Microservices exploded in popularity after Netflix and Amazon shared their architecture stories around 2014-2015. The message was compelling: break your monolith into small, independent services, and you'll get better scalability, faster deployments, and team autonomy.

What got lost in translation was context. Netflix had thousands of engineers. Amazon had hundreds of teams that needed to deploy independently. The architecture solved problems at a scale that most organizations will never reach.

Fast forward to 2026, and the pendulum is swinging back:

  • The modular monolith pattern has emerged as the pragmatic middle ground

  • Major cloud providers now offer guides on when not to use microservices (even AWS)

  • High-profile teams like Amazon Prime Video have publicly moved services back to monoliths

  • The operational cost gap between microservices and monoliths is often 3-5x when accounting for infrastructure, tooling, and platform team overhead

The industry consensus is shifting from "microservices by default" to "microservices by necessity."


7 Scenarios Where Microservices Are the Wrong Choice

Not every project needs a distributed architecture. Here are seven concrete scenarios where microservices will likely hurt more than help.

1. Your Team Can't Staff Autonomous Teams Per Service

Microservices solve an organizational problem as much as a technical one. They allow large teams to work independently without stepping on each other's code. Each microservice ideally needs a dedicated team of 5-8 people (Amazon's "two-pizza team" concept) who can own it end-to-end.

If your organization isn't large enough to staff autonomous teams per service โ€” and for most companies, that means having dozens of developers โ€” you're adding distributed systems complexity without the organizational benefit.

Rule of thumb: If your entire engineering team fits in one meeting room, you probably don't need microservices.

2. You're Building an MVP or Early-Stage Product

In the early stages, your domain model is still evolving. You don't know which boundaries will be stable enough to become service boundaries. Premature decomposition means you'll spend more time refactoring service boundaries than building features.

As Martin Fowler observed: "Almost all the successful microservice stories have started with a monolith that got too big and was broken up."

What to do instead: Build a well-structured monolith with clear module boundaries. You can extract services later when you have real data about which components need independent scaling.

3. Your Domain Boundaries Are Unclear

Microservices work best when you have well-defined bounded contexts (in Domain-Driven Design terms). If your team frequently debates where a feature "belongs," or if services constantly need to call each other for basic operations, your boundaries are wrong.

A distributed monolith โ€” microservices that can't function independently โ€” is the worst of both worlds: all the network overhead with none of the autonomy benefits.

4. Your Team Lacks DevOps Maturity

Microservices require a significant operational foundation:

CapabilityRequired For MicroservicesMonolith Alternative
Container orchestration (K8s)Running dozens of servicesSingle deployment
Service mesh (Istio/Linkerd)Service-to-service communicationFunction calls
Distributed tracing (Jaeger)Debugging across servicesStack traces
CI/CD per serviceIndependent deploymentsOne pipeline
Centralized loggingCorrelating logs across servicesgrep

If your team doesn't already have these capabilities, the infrastructure tax will consume more engineering time than feature development.

5. Your Application Has Low Traffic and No Independent Scaling Needs

If all parts of your system scale together and your peak traffic can be handled by a single well-provisioned server (or a simple auto-scaling group), microservices add network latency and operational complexity for zero benefit.

Network calls are orders of magnitude slower than in-process function calls โ€” a typical HTTP call between services takes 1-5 milliseconds, while an in-process function call completes in microseconds or nanoseconds. Every service boundary you introduce adds latency, potential failure points, and debugging complexity.

6. You Need Strong Data Consistency

Microservices favor eventual consistency โ€” each service owns its data, and changes propagate asynchronously. If your domain requires strong transactional consistency (financial systems, inventory management, booking systems), you'll need to implement distributed transactions (sagas, two-phase commit) that are notoriously difficult to get right.

A monolith with a single database gives you ACID transactions for free.

7. You're a Startup With Limited Budget

The total cost of ownership for microservices is significantly higher:

  • Infrastructure: More containers, load balancers, service meshes

  • Tooling: Observability platforms, API gateways, secrets management

  • People: Platform engineers command $140,000-$180,000/year salaries (US average)

  • Cognitive overhead: Every developer needs to understand distributed systems patterns

For a startup, that money and engineering time is better spent on product development.


The Real Cost: Why Microservices Are 3-5x More Expensive

The cost gap between microservices and monoliths is wider than most teams expect. Here's where the money goes:

Cost CategoryMonolithMicroservicesWhy It's Higher
ComputeSingle process, efficientDozens of containers, each with overheadEach service needs its own resources, plus orchestration
NetworkingIn-process calls (free)Cross-service HTTP/gRPC callsLoad balancers, service mesh, API gateways
ObservabilityStack traces, single log streamDistributed tracing, log correlationTools like Datadog/New Relic charge per host
CI/CDOne pipelinePipeline per serviceBuild times multiply, artifact storage grows
DatabaseOne database, ACID for freeDatabase per serviceMore instances, plus eventual consistency tooling
Platform teamNot needed2-3 dedicated engineersSomeone must maintain K8s, service mesh, pipelines

The multiplier effect is real. When the Amazon Prime Video monitoring team moved back to a monolith, they saw a 90% infrastructure cost reduction for that service. When Grape Up reported consolidating a client from 25 to 5 services, the result was an 82% cost reduction.

These aren't outliers โ€” they're what happens when the architecture's complexity exceeds the problem's complexity.

The hidden cost that most comparisons miss is the platform team. Microservices don't run themselves โ€” someone needs to maintain the Kubernetes clusters, service mesh, deployment pipelines, and monitoring infrastructure. That's typically 2-3 dedicated platform engineers (earning $140-180K/year in the US) who could otherwise be building product features.


Case Studies: When Teams Reversed Course

Amazon Prime Video Monitoring: 90% Cost Reduction

In 2023, the Amazon Prime Video team published a case study (originally on primevideotech.com, now covered by The Stack and DevClass) about moving their audio/video quality monitoring service from a microservices architecture (using AWS Lambda and Step Functions) back to a single-process application. The result? A 90% reduction in infrastructure costs for that specific service.

Important context: this was one monitoring tool within Prime Video, not the entire platform. But the lesson is universal โ€” their microservices were passing large volumes of video data between services through S3, creating enormous data transfer costs. Consolidating into a single process eliminated the inter-service communication entirely.

As The New Stack noted, what they built was arguably a modular monolith โ€” a single deployable unit with well-separated internal components. Amazon's core services remain microservices-based at a scale that justifies the complexity.

Grape Up Client: 25 Services Down to 5

Consulting firm Grape Up documented a client engagement where they consolidated 25 microservices into 5 well-defined services. The reported results:

  • 82% reduction in cloud infrastructure costs

  • 70% reduction in monitoring tool costs

  • 10 databases migrated into 5

  • 3 cache instances reduced to 1

The original decomposition had been driven by the "one service per entity" anti-pattern โ€” each database table essentially had its own service, leading to constant inter-service calls for basic operations. (Note: the client is anonymous, as is typical for consulting case studies.)

My Own Journey: From AWS Everything to Pragmatic Simplicity

I spent years building on AWS Lambda and ECS, decomposing everything into microservices because that's what "real architects" were supposed to do. Each function was independently deployable. Each service had its own database. The architecture diagrams looked impressive.

But the reality was different:

  • Cold starts on Lambda added latency that users noticed

  • Debugging a request that touched 6 services required correlating logs across multiple CloudWatch log groups

  • Local development was painful โ€” you can't easily run 15 services on your laptop

  • Deployment coordination still existed because services had implicit dependencies

I gradually migrated to Next.js + NestJS deployed on Vercel, Railway, and Fly.io. The result was a system that was simpler to develop, cheaper to run, and faster to iterate on. Not because these tools are inherently better than AWS services, but because the architecture matched my actual scale and team size.

The lesson: the right architecture is the one that lets you ship features, not the one that looks best on a whiteboard.


The Solutions Architect's Decision Framework

Instead of debating microservices vs. monolith in the abstract, use this scoring matrix to evaluate your specific situation. Rate each dimension from 1 (favors monolith) to 5 (favors microservices):

Dimension1 (Monolith)3 (Either)5 (Microservices)
Team size< 15 developers15-5050+
Domain maturityExploring / pivotingStable core, evolving edgesWell-defined bounded contexts
Scaling needsUniform trafficSome hotspotsComponents scale independently
DevOps maturityManual deploymentsCI/CD in placeK8s, service mesh, observability
Deployment frequencyWeekly / monthlyDailyMultiple times per day per team
Data consistencyStrong ACID requiredMix of consistent and eventualEventual consistency acceptable
BudgetConstrainedModerateSignificant infrastructure budget
Organizational structureSingle teamFew teamsMultiple autonomous teams

How to Interpret Your Score

  • 8-16 points: Monolith โ€” A well-structured monolith is your best bet. Focus on clean module boundaries and solid testing.

  • 17-28 points: Modular Monolith โ€” You need better separation than a traditional monolith but don't need the overhead of full microservices. This is the sweet spot for most organizations.

  • 29-40 points: Microservices โ€” You have the scale, team structure, and operational maturity to benefit from microservices. Proceed with clear domain boundaries.

Decision Flowchart

Start
  โ”‚
  โ”œโ”€ Team < 15 people? โ”€โ”€โ”€โ”€ YES โ”€โ”€โ†’ Monolith
  โ”‚         โ”‚
  โ”‚        NO
  โ”‚         โ”‚
  โ”œโ”€ Domain boundaries clear? โ”€โ”€ NO โ”€โ”€โ†’ Monolith (define boundaries first)
  โ”‚         โ”‚
  โ”‚        YES
  โ”‚         โ”‚
  โ”œโ”€ DevOps maturity high? โ”€โ”€โ”€โ”€ NO โ”€โ”€โ†’ Modular Monolith
  โ”‚         โ”‚
  โ”‚        YES
  โ”‚         โ”‚
  โ”œโ”€ Independent scaling needed? โ”€โ”€ NO โ”€โ”€โ†’ Modular Monolith
  โ”‚         โ”‚
  โ”‚        YES
  โ”‚         โ”‚
  โ””โ”€ Team > 50 & multiple teams? โ”€โ”€ YES โ”€โ”€โ†’ Microservices
            โ”‚
           NO โ”€โ”€โ†’ Modular Monolith

The Modular Monolith: The Third Option Most Teams Ignore

If your score lands in the 17-28 range (and statistically, most teams fall here), the modular monolith deserves serious consideration.

A modular monolith is a single deployable unit with strictly enforced module boundaries:

  • Each module owns its domain logic and data access

  • Modules communicate through well-defined internal APIs (not direct database queries)

  • Shared kernel is kept minimal โ€” only truly cross-cutting concerns

  • Each module can be independently tested

The beauty of this approach is that it gives you a clear migration path. When (and if) a module genuinely needs to become an independent service โ€” because it needs to scale independently, or a separate team needs to own it โ€” you can extract it with minimal refactoring because the boundaries are already defined.

Frameworks like NestJS modules, Spring Boot's module system, and .NET's project structure make this pattern straightforward to implement.

The modular monolith is not a compromise โ€” it's the optimal architecture for teams of 10-100 engineers who need clean separation without distributed systems complexity.


Pre-Migration Readiness Checklist

Before committing to microservices, ensure your organization can answer "yes" to these questions:

  • [ ] We have automated CI/CD pipelines for every service

  • [ ] We have container orchestration (Kubernetes or equivalent) in production

  • [ ] We have centralized logging and distributed tracing across services

  • [ ] We have defined clear bounded contexts with minimal cross-service dependencies

  • [ ] We have a dedicated platform / DevOps team (or budget for one)

  • [ ] Each service can be deployed independently without coordinating with other teams

  • [ ] We have a strategy for data consistency across service boundaries

  • [ ] We have service-level SLAs and monitoring for each service

  • [ ] Our developers are comfortable with distributed systems patterns (circuit breakers, retries, sagas)

  • [ ] We have a plan for local development that doesn't require running all services

  • [ ] Our monthly infrastructure budget can absorb a 2-3x increase

  • [ ] We have enough developers to staff autonomous teams (5-8 people) per service

If you answered "no" to more than 3 of these, you're not ready for microservices. Consider a modular monolith as your next step, and revisit this checklist in 6-12 months.


Conclusion: Making the Right Call

The microservices vs. monolith debate has always been a false binary. The real question is: what architecture gives your specific team the best chance of shipping quality software quickly?

For most teams in 2026, the answer is somewhere between a monolith and full microservices โ€” and that's perfectly fine. The modular monolith pattern gives you clean boundaries, testability, and a future migration path without the operational tax of distributed systems.

Here's what I wish someone had told me when I was spinning up my fifth Lambda function for a project with three contributors:

Start with the simplest architecture that could work. Add complexity only when you have evidence โ€” not speculation โ€” that you need it.

Architecture decisions should be driven by your team's size, your domain's maturity, your operational capabilities, and your budget. Not by conference talks, not by what FAANG companies do, and definitely not by your architecture diagram's aesthetic appeal.

Use the decision framework in this article. Score your project honestly. And if the score says monolith or modular monolith โ€” embrace it. You'll ship faster, spend less, and sleep better.

Next time someone says "we need microservices," ask them to score it first.

้ปƒๅฐ้ปƒ

้ปƒๅฐ้ปƒ

Full-stack product engineer and open source contributor based in Taiwan. I specialize in building practical solutions that solve real-world problems with focus on stability and user experience. Passionate about Product Engineering, Solutions Architecture, and Open Source collaboration.

More Posts

Beyond Chatbots: Building Real-World Stateful AI Agents on Cloudflare

Beyond Chatbots: Building Real-World Stateful AI Agents on Cloudflare

Most "AI agents" you see today are just LLM wrappers with a fancy prompt. They process a request, return a response, and forget everything. No memory. No scheduling. No persistence. Real agents are different. They remember what happened yesterday. Th...

้ปƒๅฐ้ปƒ ้ปƒๅฐ้ปƒ · · 14 min
Your API Wasn't Built for AI Agents โ€” Here's How to Fix It

Your API Wasn't Built for AI Agents โ€” Here's How to Fix It

By 2026, over 30% of API traffic will come from AI agents rather than human-driven applications. That number will keep climbing. Here's the uncomfortable truth: most APIs were designed for human developers who read documentation, interpret ambiguous ...

้ปƒๅฐ้ปƒ ้ปƒๅฐ้ปƒ · · 16 min