A pragmatic guide to choosing between monoliths, microservices, and the middle ground. Based on real-world architecture decisions at scale.
Unless you have very specific scaling requirements, start with a monolith. Microservices introduce distributed systems complexity, network partitions, eventual consistency, service discovery, distributed tracing, that most early-stage products don't need.
A well-structured monolith can handle significant scale. Many successful companies (Shopify, Stack Overflow, Basecamp) run primarily on monolithic architectures serving millions of users.
When to Go Micro
Consider microservices when: different parts of your system have fundamentally different scaling requirements, you have multiple teams that need to deploy independently, or specific components need different technology stacks.
The organizational argument is often the strongest: if team coordination costs are significantly slowing down development, service boundaries that align with team boundaries can restore velocity.
The Modular Monolith
The modular monolith is an often-overlooked middle ground. Structure your monolith with clear module boundaries, well-defined interfaces between modules, and strict dependency rules. This gives you most of the organizational benefits of microservices without the operational complexity.
When (and if) you need to extract services, a modular monolith makes the transition straightforward because the boundaries are already defined.
Migration Strategies
If you do need to migrate from a monolith to microservices, use the Strangler Fig pattern: gradually extract functionality into services while keeping the monolith running. Never attempt a big-bang rewrite.
Start with the component that has the clearest boundaries and the strongest reason to be independent (different scaling needs, different team ownership, different deployment cadence).
Common Pitfalls
The most common microservices mistakes: making services too small (nano-services), sharing databases between services, not investing in observability, and underestimating the operational overhead of running dozens of services.
- Distributed monolith, Services so tightly coupled they must deploy together
- Shared database, Eliminates the main benefit of service independence
- Inadequate observability, Debugging distributed systems without tracing is painful
- Premature decomposition, Splitting before understanding domain boundaries
Choosing the Right Architecture for Your Business
The architecture decision should be driven by business needs, not technical trends. Consider these factors:
- Team size: Under 10 engineers, a monolith is almost certainly the right choice
- Deployment frequency: If you deploy multiple times per day, microservices may help
- System complexity: Simple CRUD applications rarely benefit from microservices
- Regulatory requirements: Some compliance frameworks benefit from service isolation
- Budget: Microservices typically cost 2-3x more to operate than equivalent monoliths
Frequently Asked Questions
Should a startup start with microservices?
Almost never. Start with a well-structured monolith. You can always extract services later when you have clear evidence that your architecture is limiting your growth.
What's the biggest mistake companies make with microservices?
Adopting microservices for technical reasons when the real problem is organizational. If your teams can't communicate effectively, splitting them across services won't fix that, it will just make the communication problems more expensive.
How do I know when it's time to move from monolith to microservices?
When you have clear evidence that: (1) different parts of your system have different scaling needs, (2) team coordination is significantly slowing development, or (3) specific components need different technology stacks or deployment cadences.
Written by
James Mwangi
Cloud Architect