Moving from a monolith to microservices pays off when several teams are blocked on each other's releases, when parts of the system need to scale or deploy independently, and when the organization can run the operational overhead that comes with it. It does not pay off for a single team of fewer than ten engineers, for a system that releases without pain, or as a way to fix code nobody understands. For most mid-sized companies the right first step is a modular monolith.
Prices are in US dollars. Euro and pound figures in parentheses are approximate, rounded conversions. Quotes are issued in the currency of your contract.
Microservices are the modernization option most often chosen for the wrong reason. A large company had success with them, a conference talk made them sound like the grown-up architecture, and a monolith that releases once a month seems like the obvious thing to blame. Sometimes it is. More often the monolith is fine and the problem is a team structure, a missing test suite or a deployment pipeline that takes a day. This post gives you the signs that a move will pay for itself, the signs that it will cost you two years and leave you worse off, and a decision rule you can apply to your own system this week.
What are the signs that microservices will pay off?
- Teams block each other. Three or more teams work in one codebase and a release needs all of them to be ready at once. Release trains, merge freezes and a release manager are the symptoms.
- Parts of the system have different scaling needs. The search function needs ten times the capacity of the invoicing function, and today you scale the whole thing.
- Parts of the system change at very different rates. The pricing engine changes weekly, the ledger changes yearly, and every pricing release risks the ledger.
- A failure in one function takes everything down. A slow report locks the database and nobody can take an order.
- You can run it. There is a platform team, or the budget for one, that can own deployment pipelines, service discovery, monitoring and on-call for a dozen or more services.
What are the signs that it will not?
- One team, fewer than ten engineers. Microservices solve a coordination problem between teams. One team has no such problem, and will spend its time on infrastructure instead of features.
- Releases are painful for reasons that are not architectural. No automated tests, a manual deployment, an environment that differs from production. Microservices make all of these worse, not better.
- Nobody understands the codebase. You cannot split a system into services along boundaries you cannot see. Understand it first, usually by refactoring it into modules.
- The data model is shared everywhere. If every function joins across the same twenty tables, splitting the code leaves you with twelve services and one database, which is a distributed monolith with extra network calls.
- The motive is hiring or fashion. "Engineers want to work on microservices" is a real pressure and a poor reason to spend $600,000 to $2,000,000+ (€520,000 to €1,740,000+, £445,000 to £1,480,000+).
How do the three architectures compare?
| Dimension | Monolith | Modular monolith | Microservices |
|---|---|---|---|
| Team size it suits | 1 to 10 engineers | 5 to 40 engineers in a few teams | 30+ engineers in several autonomous teams |
| Deployment | One unit, one release | One unit, but modules can be tested and owned separately | Each service deploys on its own schedule |
| Scaling | Whole application | Whole application, with heavy modules sometimes extracted | Per service |
| Operational burden | Low: one thing to run | Low to moderate | High: pipelines, discovery, tracing, on-call across many services |
| Cost to reach | Where most systems start | A refactor, 3 to 5x a rehost, incremental | A rebuild or major refactor, 5 to 10x a rehost, plus a platform team |
| Failure isolation | None | Partial, through module boundaries | Strong, if designed for it |
| Typical failure | Everyone blocked on one release | Modules quietly reach into each other's tables | A distributed monolith: services that cannot deploy without each other |
The modular monolith is the architecture most mid-sized companies should want and few ask for. It is one deployable unit, which keeps operations simple, with hard internal boundaries between modules, each owning its own tables and exposing an interface. Teams own modules. Tests run per module. And when a module genuinely needs to scale or deploy on its own, it is already shaped like a service and can be extracted in weeks rather than months.
How do you extract a service without a rewrite?
The strangler approach is the same method described in modernizing without the big bang, applied to one function at a time:
- Pick the function with the clearest boundary and the most pain. Usually something with its own data and a scaling or release problem: search, notifications, reporting, a pricing engine.
- Put an interface in front of it inside the monolith. Every caller goes through that interface. This step alone often fixes half the pain, and it is the modular monolith move.
- Give it its own data. The function's tables are separated and nothing else reads them directly. This is the hard part and the one that tells you whether the boundary is real.
- Move it behind the network. The interface now calls a separate service. Traffic is routed gradually. The old code path stays until the new one has proven itself.
- Delete the old code. If this step is skipped the monolith never gets smaller.
Each extraction is a project of weeks to a few months, with a visible outcome, which is what keeps sponsorship alive. A program of extractions is how a monolith becomes a handful of services over a year or two without a cutover. The cloud migration post covers the infrastructure side that often runs in parallel.
What does it cost to run microservices?
The build cost gets the attention. The run cost is the surprise. Each service needs a pipeline, monitoring, logging, tracing, secrets, a deployment target and someone on call. A dozen services need a platform: a container orchestrator or a managed equivalent, service discovery, a gateway, centralized observability. That platform needs one to three engineers to own it, which at onshore rates is $200,000 to $600,000 per year (€175,000 to €520,000 per year, £150,000 to £445,000 per year) in people before any cloud bill. For a company with 30 engineers that is a reasonable share. For a company with eight, it is the whole team. What cloud hosting is gives the basics if the terms are new.
What is the decision rule?
Apply this to your system
- Fewer than 10 engineers, releases are fine: stay a monolith. Fix the tests and the pipeline.
- Fewer than 10 engineers, releases hurt: modular monolith. The pain is boundaries, not deployment units.
- 10 to 40 engineers, teams block each other: modular monolith first, then extract the two or three modules where the blocking happens.
- 40+ engineers, several teams, different scaling needs, a platform team: microservices, extracted one at a time by the strangler approach.
- Any size, nobody understands the code: refactor into modules first. You cannot split what you cannot see.
Where you land on this rule is a fact about your organization, not about the technology. A monolith is not a failure. It is the right architecture for most systems most of the time, and the companies that get the most from microservices are the ones that waited until they needed them. Technical debt in a monolith is usually a missing module boundary, which is a far cheaper thing to fix than a missing service.
How 7L approaches it
7L International designs, builds and modernizes software end-to-end from hubs in New York, London and Athens, and has supported more than one hundred organizations with systems of every shape. We are not partisans for any architecture. We have built microservice platforms where several teams needed independence, and we have talked clients out of them where one team needed a test suite. Our default for a mid-sized company is a modular monolith with services extracted where the pain is measured, delivered in slices so each one shows a result. The modernization options post places this among the alternatives, and the enterprise software development guide covers the full engagement. If your releases hurt and you are not sure why, tell us how you ship today and we will tell you whether the architecture is the problem.
Frequently asked questions
Should a company with ten developers use microservices?
Almost never. Microservices solve coordination problems between several teams, and a single team of ten does not have one. The same team will spend its time on pipelines, service discovery and on-call instead of features. A modular monolith, one deployable unit with hard internal boundaries, gives most of the benefit at a fraction of the operating cost, and services can be extracted later if a real need appears.
What is a modular monolith?
A single deployable application whose code is divided into modules with strict boundaries: each module owns its own data tables and exposes an interface, and no module reaches into another's tables. It keeps operations simple because there is one thing to deploy and run, while giving teams ownership and making it possible to extract a module into a separate service in weeks if it ever needs to scale or deploy on its own.
How long does it take to move from a monolith to microservices?
Extracting one well-bounded service takes weeks to a few months. A full program that turns a core monolith into a handful of services, done one extraction at a time with the strangler approach, takes one to two years. A single rewrite into microservices with a cutover date is the version that takes three years and often does not finish.
What is a distributed monolith?
A system split into services that still cannot be deployed or changed independently, usually because they share a database or call each other in long synchronous chains. It has the operational cost of microservices and the coupling of a monolith, which is the worst of both. It is the usual result of splitting code without first splitting the data.
What does it cost to run microservices?
Beyond the build, a platform of a dozen or more services needs an orchestrator or managed equivalent, a gateway, centralized logging and tracing, and one to three engineers to own it, which at onshore rates is $200,000 to $600,000 per year (€175,000 to €520,000 per year, £150,000 to £445,000 per year) in people before the cloud bill. For an engineering organization of 30 or more that is a sensible share. For one of eight it is the entire team.