← All insights

Architecture · 6 min read

Microservices, macroservices or a modular monolith: how to size your services

By BizDevHub ·

The question isn't "monolith or microservices." It's "what is the smallest architecture that meets our real constraints today, and how cheaply can we change it later?"

Three shapes

What the evidence says

Martin Fowler wrote in "Monolith First" that "almost all the successful microservice stories have started with a monolith that got too big and was broken up," and that in the cases he'd heard of where a system was built as microservices from scratch, it had "ended up in serious trouble." That is one practitioner's observation, not a law, but it matches the cost structure: every service boundary adds network calls, versioned contracts, deployment pipelines and distributed failure modes.

Split when a real constraint appears

SignalSuggests
One component needs to scale far beyond the restExtract that component
Separate teams keep blocking each other's releasesSplit along team ownership
Parts need different release cadence or compliance scopeIsolate the regulated part
A part needs a different runtime or languageExtract it behind an API
You have under ~10 engineers and one productStay modular and monolithic

The costs people forget

Our default recipe

  1. Start as a modular monolith with enforced module boundaries (one module per business capability, communication through defined interfaces).
  2. Use queues and webhooks for the integrations that are already asynchronous.
  3. Write automated tests at module boundaries so a later split is mechanical.
  4. Extract a service only when a row in the table above is true, and migrate incrementally with the strangler pattern.

Applying it

This is the architecture step of our digital transformation work. If you're weighing a split, book a call and bring your constraints; we'll tell you honestly if you don't need one.