Hidden Problems of Microservices: When Monoliths Save Time And Money

A Series B startup. 23 microservices. 10,000 daily active users.

Their AWS bill: $47,000/month.

After consolidating to 4 services: $18,000/month.

That's $348,000 saved per year. Not from clever optimization. Not from better caching. Just from admitting they didn't need microservices.

The Lies We Tell Ourselves

Lie #1: "We Need Microservices to Scale"

Netflix handles 100,000 requests per second. You handle 100.

You're cosplaying as Netflix with 0.1% of their traffic. And paying enterprise prices for startup problems.

Here's the truth: A single m5.xlarge EC2 instance can handle 10,000 requests per second for typical CRUD operations. Cost: $140/month.

Your 23 microservices on t3.medium instances? $1,150/month. For 100 requests per second.

Lie #2: "Microservices Make Development Faster"

20 repositories. 20 CI/CD pipelines. 20 sets of dependencies.

One feature touches 5 services? That's 5 pull requests, 5 code reviews, 5 deployments, 5 places where something can break.

Your "2-day feature" just became a 2-week distributed systems debugging session.

Lie #3: "It's Industry Best Practice"

Best practice for whom? Amazon with 10,000 engineers? Or your 15-person startup?

Amazon created microservices because hundreds of teams were stepping on each other. You created microservices because a Medium article told you to.

The Hidden Invoice

Pull up your AWS Cost Explorer. I'll wait.

Now let's find the costs you're not seeing:

Data Transfer: The Silent Killer

Every API call between your services costs money. AWS charges $0.01/GB for cross-AZ transfer.

Let's do kindergarten math:

  • User request → API Gateway → Service A → Service B → Service C → Database

  • Each hop: ~10KB request + 50KB response = 60KB

  • 1 million requests/day × 60KB × 5 hops = 300GB/day

  • Monthly damage: $900 just playing hot potato with your own data

Your monolith? Zero internal transfer costs. Zero.

The Load Balancer Tax

Each microservice needs an Application Load Balancer. AWS charges $0.025/hour + data processing fees.

20 services × $18/month = $360/month

Plus $0.008/GB processed. With 1TB/month per service: another $160.

Total: $520/month for the privilege of having multiple services.

One monolith needs one load balancer. $18/month. Done.

The Observability Black Hole

DataDog charges per host. CloudWatch charges per log group. New Relic charges per service.

Real numbers from a real startup:

  • DataDog: 20 hosts × $100/month = $2,000

  • CloudWatch Logs: 20 log groups × 50GB each = $500

  • CloudWatch Metrics: 200 custom metrics × $0.30 = $60

  • X-Ray tracing: 10 million traces × $0.000005 = $50

Total: $2,610/month to watch your 20 services do nothing special.

Same app as a monolith: $300/month.

Database Proliferation Disease

The microservices textbook says each service needs its own database.

20 services × RDS t3.small ($35/month) = $700/month

Plus backup storage, plus snapshots, plus read replicas for the important ones.

Real total: $1,400/month.

One RDS t3.xlarge handling everything: $280/month. With better performance.

The NAT Gateway Scam

Your private microservices need internet access. NAT Gateway: $45/month + $0.045/GB.

20 services downloading packages, pulling images, sending webhooks = 2TB/month.

NAT Gateway bill: $135/month.

Monolith in public subnet with security groups: $0/month.

When Microservices Actually Make Sense

Stop defending your architecture. Answer these honestly:

Do you have teams that CANNOT coordinate releases? Not "prefer not to." Not "it's annoying." CANNOT. If your teams can sit in one Zoom call, you don't need microservices.

Do different parts scale at 100x different rates? Not 2x. Not 10x. ONE HUNDRED TIMES. Your user service gets 1,000 req/sec while your PDF generator gets 10? That's 100x. You win. Extract it.

Do you NEED different programming languages? Not want. NEED. Machine learning in Python while everything else is in Java? Fine. Extract just that.

No to all three? You're burning $30,000/month for architectural purity.

The Smart Monolith Pattern

One codebase. Multiple modules. Clear boundaries. No network calls.

app/
├── billing/        # Domain logic
├── users/          # Domain logic  
├── notifications/  # Domain logic
├── api/           # HTTP layer
└── shared/        # Common utilities

Each module has its own:

  • Domain models

  • Business logic

  • Database schema (same database, different schemas)

  • Tests

What it doesn't have:

  • Separate repository

  • Separate CI/CD pipeline

  • Separate monitoring

  • Separate deployment

  • Network calls to other modules

When you hit 10,000 requests per second (you won't), the boundaries are ready. Extract then. Not now.

The Extraction Threshold

Only extract a service when:

It's costing you customers The monolith literally cannot handle the load. Not "might not" in the future. Cannot. Today. Customers are leaving.

It's costing you engineers Teams are blocked weekly because of deployment conflicts. Not occasionally annoyed. Blocked. Weekly. Productivity is measurably dying.

It's costing you compliance PCI DSS requires payment processing isolation. HIPAA requires healthcare data separation. The auditor says "separate system" and means it.

Everything else is resume-driven development.

The Migration Math

Your current setup:

  • 20 microservices

  • 5-person engineering team

  • 100 requests/second peak traffic

  • $15,000/month infrastructure

After consolidation to 3 services:

  • API monolith (95% of your logic)

  • Background jobs (the stuff that actually needs different scaling)

  • Notifications (the thing that spikes 10x during campaigns)

New costs:

  • Infrastructure: $4,000/month

  • Saved: $11,000/month

  • Annual savings: $132,000

That's two engineers' salaries. Or seed funding runway extension. Or actual features instead of fixing distributed system bugs.

Your Action Items Right Now

  1. Run this query in CloudWatch Insights: Find out how many internal API calls you're making. Multiply by $0.01/GB. Cry.

  2. Count your Load Balancers: Go to EC2 → Load Balancers. Count them. Multiply by $18. That's your ALB tax.

  3. Check your DataDog bill: Settings → Usage → Hosts. How many are just the same app split up?

  4. List services owned by the same team: If the same people own multiple services, why are they separate?

The truth nobody wants to hear: Your startup doesn't need microservices. You need a product that works, customers who pay, and money in the bank.

Keep Reading

No posts found