How to Decide Where Your Next Service Boundary Actually Belongs
The build vs. buy of choosing new service boundaries usually gets framed as microservices versus monolith, as if it were one decision made once. It's better treated as a repeated question: does this specific piece of functionality deserve its own boundary, asked module by module as the system grows. Here are the criteria that actually answer it.
Vendors Covered in this Article
Disclosure: We may earn a commission if you buy through some links on this page. It doesn't change what we recommend.
Criterion 1: does it scale differently from the rest of the system
A module whose load pattern is genuinely different from the rest of the application, say a video processing job that runs long and uses heavy compute against a codebase that otherwise handles quick web requests, benefits from its own boundary so it can be scaled and resourced independently. A module that scales roughly in step with everything else gains little from separation and pays the cost of a network hop for no real benefit.
This is the strongest, most concrete criterion of the four, because it's measurable rather than a matter of team preference.
Criterion 2: does it have a genuinely different deploy cadence
A module that needs to ship several times a day, independent of the rest of the system's release cycle, is a candidate for its own service specifically so its deploys don't have to wait on or risk everything else. A module that always ships alongside the rest of the application gains nothing from a separate deploy pipeline and just adds coordination overhead between services that are, in practice, always released together anyway.
DORA's own research treats deployment frequency as one of the clearest signals of delivery performance, and it's worth asking, module by module, whether a shared deploy cadence is actually holding a specific piece of the system back1.
Criterion 3: does splitting it reduce or increase the number of people who need to coordinate
A module owned cleanly by one team, with a narrow, stable interface to the rest of the system, is a good boundary candidate: splitting it lets that team move without coordinating every change with everyone else. A module whose logic is tangled across concerns owned by several teams is the opposite case; splitting it before untangling the ownership just moves the coordination problem across a network boundary instead of solving it.
If you can't name the one team that would own the new service cleanly, that's a sign the split is premature, not that it needs a bigger team to support it.
Criterion 4: can you actually operate another service
Every new service adds its own deploy pipeline, its own monitoring, its own on-call surface, and its own failure modes to reason about. A team without the operational maturity to run what they already have is not helped by adding another moving part, no matter how clean the logical boundary looks on a whiteboard.
Be honest about this one specifically. It's the criterion most often skipped because it's less interesting to discuss than the architecture itself, and it's also the one whose absence causes the most pain months after the split.
When the answer is: leave it in the monolith
A module that fails most of these four criteria is better served by a clean internal boundary, a well-defined module or package inside the existing codebase, than by a network boundary. An internal boundary gets most of the benefit (isolated ownership, a clear interface, the option to extract it later) without the operational cost of a separate service. Extraction is much easier to do later, once a criterion genuinely starts failing, than reversing a premature split is to undo.
Running the four criteria as a repeatable exercise, not a one-time debate
The most useful version of this decision isn't a single architecture meeting early in a project's life; it's a short, repeatable exercise applied whenever a module starts feeling like it might deserve its own boundary. Keep the four criteria as a standing checklist rather than relitigating the whole microservices-versus-monolith question from scratch every time someone proposes a split.
A module that fails all four criteria today might pass two of them in a year as the system and team grow. Revisiting the same module against the same criteria periodically is a far steadier way to make this decision than waiting for a single big rearchitecture conversation to settle it once and for all.
Ask these four questions about any module before splitting it out:
- Does it scale differently from the rest of the system, with a load pattern that would benefit from independent resourcing?
- Does it have a genuinely different deploy cadence, needing to ship far more often than the rest of the application?
- Would splitting it reduce the number of people who must coordinate, given a single owning team and a narrow, stable interface?
- Can your team actually operate another service, including its pipeline, monitoring, on-call surface, and failure modes?
What Good Looks Like
Good service-boundary decisions mean a new split is justified against scaling profile, deploy cadence, team ownership, and real operational capacity, not drawn from a general preference for microservices.
Building The Capability (5-Stage Skill Ladder)
How to Get Started
Disclosure: We may earn a commission if you buy through some links on this page. It doesn't change what we recommend.
Every new service boundary is also a new thing to patch and monitor for exposure; factoring that ongoing cost into the operational criterion above is where Tenable's per-asset view earns its keep.
A split that adds a new internet-facing service also adds a new endpoint worth watching; CrowdStrike coverage is one more line item to check off before calling a service boundary production-ready.
Frequently Asked Questions
Is there a team-size threshold where microservices start making sense?
Team size matters less than whether the four criteria above are actually true for a specific module. A ten-person team with one module that has a genuinely different scaling and deploy profile can benefit from splitting it; a fifty-person team where every module ships together gains little from splitting for its own sake.
How do we know if we split too early?
Watch for signs like cross-service debugging taking longer than it used to, deploys of the two services needing to be coordinated anyway, or one team ending up as the de facto owner of both. Any of those suggests the split didn't match the criteria as well as it looked like it would on paper.
Can we un-split a service that shouldn't have been separated?
Yes, though it's more work than the original split, since traffic and data now flow through a network boundary that has to be collapsed back into a single deployable. It's still usually cheaper than continuing to pay the coordination cost of a boundary that never matched the underlying criteria.
Sources
Where we quote a benchmark, we show its source. Other figures in this guide are estimates or general guidance, so check them against your own numbers.
- Deployment frequency by DORA performance cluster (max days between deploys). DORA Accelerate State of DevOps 2024 (Google Cloud), cluster table via Octopus Deploy analysis, 2024.
Related Guides
Monolith or Microservices: How to Tell Which One You Actually Need
How to decide between a monolith and microservices based on your team size and deploy needs, not on which one sounds more modern.
How to Tell If Your Monolith Actually Needs Splitting
A way to decide which parts of a monolith, if any, actually need a hard service boundary, instead of splitting everything or staying stuck out of habit.
Microservices vs. Monolith: What Actually Justifies the Split
Splitting a monolith fixes a deployment coupling problem, not a code organization problem. Here is how to tell which one you actually have.
Deciding Where to Draw Service Boundaries, and Where Not To
A practical way to decide which parts of a system are actually worth splitting into services, the costs a split adds, and a safer way to test the boundary.
Where to Actually Draw Your Service Boundaries
A set of criteria for deciding where a service boundary belongs, instead of defaulting to microservices or a monolith because of what other teams are doing.
Modular Monolith or Microservices: A Decision Guide
How to decide between a modular monolith and microservices based on your team size and deploy pain, not which architecture sounds more serious.