Over the past decade, microservices have been marketed as the default architecture for modern web applications. Big tech organizations (Netflix, Uber, Amazon) publish detailed engineering posts explaining how thousands of microservices power their global platforms.
For early-stage startups and small engineering teams, adopting microservices prematurely is one of the most common causes of engineering velocity collapse.
This article outlines when microservices make sense, the severe operational tax they impose, and why a modular monolith is almost always the right starting point.
1. The Real Cost of Microservices (The Operational Tax)
Moving from a monolith to microservices does not eliminate complexity—it converts code complexity into operational and network complexity.
In a monolith, calling another function is an in-memory method invocation (0.0001ms). In a microservice architecture, calling another service requires:
- Network serialisation (JSON/gRPC over HTTP/TCP)
- Network roundtrips (10ms - 100ms)
- Handling partial network failures, timeouts, and retries
- Service discovery and load balancing
- Distributed transactions (Sagas / 2-phase commits) instead of simple database transactions
- Distributed tracing (Jaeger/Zipkin) and aggregated log collection
- Independent CI/CD pipelines and deployment orchestrations (Kubernetes, Helm)
[ Monolith ]
Function A() ──(In-Memory Call: <0.1ms)──► Function B()
[ Microservices ]
Service A ──(HTTP/gRPC Network: 25ms + DNS + Retry + TLS + Auth)──► Service B
2. Conway’s Law: The Primary Reason to Adopt Microservices
Conway’s Law states:
“Organizations which design systems are constrained to produce designs which are copies of the communication structures of these organizations.”
Microservices exist primarily to solve organizational scaling bottlenecks, not code scaling bottlenecks.
When an engineering organization grows to 50+ developers split into multiple independent product teams (e.g. Payments Team, Search Team, Shipping Team), having everyone commit to a single monolith can create deployment bottlenecks and merge conflicts.
The Decision Matrix
| Dimension | Monolith / Modular Monolith | Microservices Architecture |
|---|---|---|
| Team Size | 1 to 20 engineers | 30+ engineers across distinct teams |
| Deployment | 1 unified artifact / pipeline | 10–100+ separate pipelines |
| Data Consistency | ACID Database Transactions | Eventual Consistency / Sagas |
| Operational Overhead | Low (Single app server + DB) | High (Kubernetes, Service Mesh, Tracing) |
| Refactoring Ease | High (IDE refactoring across files) | Low (Breaking cross-service API contracts) |
3. When Microservices Actually Make Sense for Startups
While microservices are overused for general business logic, there are specific scenarios where extracting a microservice is justified:
- Heterogeneous Compute Requirements: Extracting a CPU/GPU intensive workload (e.g. AI model inference, video transcoding, PDF generation) into an isolated worker service so it doesn’t starve the primary API server of resources.
- Strict Security Isolation: Isolating PCI-compliant payment handling or sensitive healthcare data processing into a hardened microservice.
- Independent Scalability: When a specific background consumer must scale up to 100 instances independently while the rest of the application remains small.
4. The Recommended Approach: Modular Monolith First
Instead of jumping straight to microservices, build a Modular Monolith.
Structure your codebase into strict, self-contained domain modules inside a single repository:
src/
├── modules/
│ ├── identity/ # Users & Auth
│ ├── billing/ # Payments & Subscriptions
│ ├── catalog/ # Products & Services
│ └── analytics/ # Event tracking
└── main.ts # Unified HTTP Server Entrypoint
Keep communication between modules restricted to explicit internal service interfaces or events. If a module ever grows to the point where it truly requires independent scaling or a dedicated team, you can extract it into a separate microservice in hours rather than months.
Conclusion
Microservices are a tool to solve organizational scaling problems at scale. For startups aiming for maximum engineering velocity with a team under 20 developers, a well-architected modular monolith will deliver faster feature velocity, simpler deployments, and drastically lower operational costs.