The call always comes the same way: “Our monolith can’t keep up anymore. We need microservices.” We have been hearing this for years, from startups, manufacturers, and e-commerce shops. The problem is rarely the monolith: it is that most people who say it haven’t yet measured the real cost of migration.
At Meteora Web, we think in numbers. We come from accounting — we have managed balance sheets and double-entry bookkeeping. A software architecture is not a philosophical choice: it is an investment. If we do not know how much it costs and how much it returns, we do not start. In this guide we walk you through our decision process: when the monolith is fine, when it chokes, and how to spot the microservices myth.
The monolith is not the enemy. Coupling is
A monolithic application means a single deployable process with all code packaged together. It works perfectly for years. We have clients with well-built PHP monoliths that generate millions in revenue on a single 4 GB RAM server. Why? Because the domain is cohesive, the team is small, and deployment is a well-oiled procedure.
The real issue is not code size, but how tightly the parts are coupled. You can have 500k lines with low coupling if you follow Domain-Driven Design and keep bounded contexts logically separated inside the same deployable. You can have 10 microservices with high coupling because they share the same database or synchronous cascading calls.
The right question is not «monolith or microservices?» but «how do we reduce coupling at an acceptable cost?».
Signs that the monolith is still the better choice
- Team under 8–10 people: a well-organized monolith is easier to understand, deploy, and debug. With microservices you multiply CI/CD, centralized logging, orchestration. The cognitive cost skyrockets.
- Multiple deploys per day with builds under 2 minutes: if your deploy cycle is fast and reliable, the monolith is not slowing you down.
- Product in exploration phase: requirements change weekly. Changing a monolith is much faster than modifying interfaces and contracts between services.
- Tight infrastructure budget: microservices = at least a Kubernetes cluster. That is a management cost that does not appear on the first invoice but becomes a heavy line item after three months.
The scalability myth
Many think: “With microservices, if a module overloads I just replicate it.” True, but only if you actually have uneven loads. In 90% of projects we see, the bottleneck is the database, not the application code. Scaling the database horizontally is the real problem, and microservices do not solve it magically. In fact, they make it worse: you distribute data across multiple DBs and then need distributed transactions, eventual consistency, saga patterns. You trade one simple problem (slow) for five medium ones (complex).
The tipping point: when the monolith becomes a drag
You recognize it from three concrete indicators:
- Deployment takes more than 30 minutes and every merge is a nightmare. As the team grows and merge conflicts become daily, the monolith size has outgrown your ability to manage code.
- You can no longer experiment with different stacks. If one team wants Python for an ML module and the monolith is Java, they must wait for a big rewrite. With microservices, each service can use its own language.
- Single point of failure is real. A bug in a logging function crashes the whole system. A bad deployment takes down billing, catalog, and checkout together.
We worked with a fashion e-commerce client that had a PHP/MySQL monolith with 300 tables. Each production deploy took 45 minutes, testing was manual. Developer turnover was high because they spent more time resolving conflicts than writing code. Extracting a single bounded context (catalog management) as a microservice cut release time in half and reduced bugs. But we did it one domain at a time, with careful contract planning.
Our decision framework
Here is the schema we apply before any migration. No fancy tools needed — paper and pen work fine.
- Map bounded contexts: with DDD, draw the natural boundaries of your domain. Each context could become an independent microservice.
- Measure current coupling: use tools like
jdependfor Java,phpmdfor PHP, or simply analyze cross-module calls. High coupling means that splitting without preliminary refactoring is a guaranteed failure. - Identify the bottleneck: is it deployment? Load? Development speed? Often the problem is not architecture but internal processes (lack of automated tests, wrong branch strategy).
- Calculate orchestration cost: Kubernetes is not free. You need specialists, monitoring (Prometheus, Grafana), service mesh (Istio/Linkerd), centralized logging (Loki, Elastic). Annual operational cost can exceed a senior developer's salary.
An operational exercise for your team
Take your current application and time a clean build (no cache). If it exceeds 10 minutes, you have a problem. Then count how many external dependencies that build loads (JAR, npm, Composer). Over 50 packages indicates the monolith has become a big ball of mud. This is not yet a reason to migrate to microservices, but a signal to start modularizing inside the monolith, with well-separated internal packages.
Real cases from our work
The client who should not migrate
A B2B SaaS with 5 developers, 2M€ ARR, Laravel monolith, PostgreSQL. Stable load, few peaks. The CTO wanted Kubernetes and microservices “to scale”. We did the math: AWS infrastructure would jump from €800/month to over €4,000/month with Kubernetes, plus internal time to manage it. The bottleneck was an unoptimized SQL query. We fixed it with an index and a Redis cache: net savings of €3,200/month and no architectural change. The client still thanks us.
The client who needed to migrate (gradually)
Fashion e-commerce with 15 developers, Magento 2 monolith. Weekly deploys lasting 2 hours. Every release broke something. We extracted the payment module as an independent microservice with a well-defined REST API contract. After 3 months, daily releases on payments became possible without touching the rest. Then we extracted reviews. The rule is: one bounded context at a time, with precise metrics on each deploy.
Alternative architectures that often work better
Before declaring war on the monolith, consider these intermediate options:
- Modular monolith: keep a single deployable but with strongly encapsulated modules, communication via internal interfaces, isolated tests. Kevlin Henney and Simon Brown have promoted it for years. It works.
- Vertical slice architecture: organize code by feature, not by layer. Reduces coupling and makes it possible to extract a microservice later without rewriting everything.
- Microservices only for bottlenecks: extract only the module that needs to scale independently (e.g., notification process, document rendering). Rest stays monolithic.
We used a modular monolith for a time-tracking system for a Sicilian cooperative: 40,000 employees, predictable load. With PHP and modules separated by namespace and dependency injection, we got excellent performance and maintainability without paying for Azure Kubernetes. The digital divide is also geographical: businesses in the South deserve top-tier technology, but at sustainable costs.
In summary – What to do now
- Ignore trends. Microservices solve organizational problems, not technical ones. Small team, cohesive domain? Keep the monolith.
- Measure before you cut. Build time, coupling, number of git conflicts per month, deployment frequency. Each data point is worth more than a fancy architecture diagram.
- Try modular monolith as a first step. Separate bounded contexts at the code level with clean interfaces. When you genuinely need to scale only one module, extract it.
- Calculate total cost of ownership. Include DevOps hours, infrastructure, monitoring, training. If you do not break even within 12 months, it is not worth it.
- Rely on someone who has seen both worlds. We have built monoliths that generate revenue and microservice platforms that manage dozens of clients simultaneously. We know where hidden costs lurk.
If you are evaluating a migration, start here: your monolith is an asset, not a problem. Get to know it before you tear it down.
Sponsored Protocol