Chaturmind
LearnDSASystem DesignDevOpsEngineering GrowthBlog
Start learning
Chaturmind

Structured learning paths for engineers who want to go deep. Written by practitioners.

Learn

  • Java
  • DSA
  • System Design
  • Spring Boot
  • AI / ML
  • DevOps
  • Engineering Growth

Company

  • Blog
  • Contact

Legal

  • Privacy Policy
  • Terms of Service

Β© 2026 Chaturmind. All rights reserved.

Built for engineers who want to go deep.


← System Design Interview Playbook

Interview Framework

  • The 6-Step Design Framework
  • HLD Fundamentals Refresher
  • Requirement Gathering Practice
  • Domain Decomposition
  • API Contract Design
  • Data Ownership Model
  • Failure Scenario Walkthroughs
  • Architecture Diagramming
  • Back-of-Envelope Estimation

10 Case Studies

  • Design a URL Shortener
  • Design Twitter / X
  • Design WhatsApp
  • Design Netflix
  • Design a Rate Limiter
  • Design a Search Autocomplete
  • Design a Distributed Cache
  • Design a Notification Service
  • Design Uber / Ride Sharing
  • Design a Distributed File Storage System
  • Design a Distributed Task Scheduler
  • Design a Message Queue System
  • Design an Authentication System at Scale
  • Design a Distributed Logging & Metrics Pipeline
  • Design a Food Delivery Platform
  • Design a Real-Time Analytics Dashboard
  • Design a Monitoring & Alerting System
  • Design Container Orchestration Basics
  • Design a CI/CD Pipeline System
  • Design Service Mesh Basics
  • Design a Centralized Configuration & Secrets System
  • Design a Batch Processing System
  • Design a Data Warehouse / Analytics Storage Layer
  • Design Global Content Delivery
  • Case studies

    πŸ—οΈDesign a URL Shortener
  • πŸ—οΈDesign a Rate Limiter
  • πŸ—οΈDesign Twitter / X
  • πŸ—οΈDesign WhatsApp
  • πŸ—οΈDesign Netflix
  • πŸ—οΈDesign a Distributed Cache
  • πŸ—οΈDesign a Notification Service
  • πŸ—οΈDesign a Search Autocomplete System
  • πŸ—οΈDesign Uber / Ride Sharing
  • πŸ—οΈDesign a Web Crawler
  • πŸ—οΈDesign a Payment System
  • πŸ—οΈDesign a Distributed Lock Service
  • πŸ—οΈDesign a Video Streaming Platform
  • πŸ—οΈDesign a Search Engine
  • πŸ—οΈDesign E-Commerce Checkout & Inventory at Scale
Chaturmind
← System Design Interview Playbook

Interview Framework

  • The 6-Step Design Framework
  • HLD Fundamentals Refresher
  • Requirement Gathering Practice
  • Domain Decomposition
  • API Contract Design
  • Data Ownership Model
  • Failure Scenario Walkthroughs
  • Architecture Diagramming
  • Back-of-Envelope Estimation

10 Case Studies

  • Design a URL Shortener
  • Design Twitter / X
  • Design WhatsApp
  • Design Netflix
  • Design a Rate Limiter
  • Design a Search Autocomplete
  • Design a Distributed Cache
  • Design a Notification Service
  • Design Uber / Ride Sharing
  • Design a Distributed File Storage System
  • Design a Distributed Task Scheduler
  • Design a Message Queue System
  • Design an Authentication System at Scale
  • Design a Distributed Logging & Metrics Pipeline
  • Design a Food Delivery Platform
  • Design a Real-Time Analytics Dashboard
  • Design a Monitoring & Alerting System
  • Design Container Orchestration Basics
  • Design a CI/CD Pipeline System
  • Design Service Mesh Basics
  • Design a Centralized Configuration & Secrets System
  • Design a Batch Processing System
  • Design a Data Warehouse / Analytics Storage Layer
  • Design Global Content Delivery
  • Case studies

    πŸ—οΈDesign a URL Shortener
  • πŸ—οΈDesign a Rate Limiter
  • πŸ—οΈDesign Twitter / X
  • πŸ—οΈDesign WhatsApp
  • πŸ—οΈDesign Netflix
  • πŸ—οΈDesign a Distributed Cache
  • πŸ—οΈDesign a Notification Service
  • πŸ—οΈDesign a Search Autocomplete System
  • πŸ—οΈDesign Uber / Ride Sharing
  • πŸ—οΈDesign a Web Crawler
  • πŸ—οΈDesign a Payment System
  • πŸ—οΈDesign a Distributed Lock Service
  • πŸ—οΈDesign a Video Streaming Platform
  • πŸ—οΈDesign a Search Engine
  • πŸ—οΈDesign E-Commerce Checkout & Inventory at Scale
HomeLearnSystem DesignSystem Design Interview PlaybookInterview Framework
βœ“ FreeIntermediateΒ· 8 min read

Domain Decomposition

How to split a system into services along business-capability boundaries (not technical layers), using bounded contexts, and the concrete red flags that mean a proposed split is wrong.

Published September 23, 2026


Domain Decomposition

Once requirements are gathered (Requirement Gathering Practice) and before any boxes get drawn, an HLD interview needs one more decision made explicitly: how many services, and split along what lines? This is the step most candidates skip straight past, jumping to a plausible-looking box diagram without ever stating the reasoning for where the boundaries are.

Splitting along business capability, not technical layers

WRONG (technical layers as "services"):
  "Database Service" | "Business Logic Service" | "API Service"
  β€” these aren't independently deployable or independently scalable; they're just
  a single application's internal layers relabeled as "microservices"

RIGHT (business capability):
  Order Service | Inventory Service | Payment Service | Notification Service
  β€” each owns a complete vertical slice: its own data, its own business rules,
  its own API, deployable and scalable independently of the others

The most common decomposition mistake in an interview is splitting by technical layer (a "data access service," a "validation service") rather than by business capability. Technical-layer splits don't actually decouple anything β€” every request still has to traverse all the layers in lockstep, so you've added network hops and deployment complexity without gaining any of microservices' real benefits (independent scaling, independent deployment, fault isolation).

Bounded contexts

Bounded context (from Domain-Driven Design) is the sizing principle: a boundary within which a specific business concept has one consistent meaning and model. "Customer" means something different to the Billing service (payment methods, invoices) than to the Support service (ticket history, contact preferences) β€” each service should own its own model of "Customer" scoped to what it actually needs, rather than one shared "Customer" entity every service depends on. Forcing a single shared model across bounded contexts is a common root cause of tightly-coupled services that all break together.

Concrete red flags a proposed split is wrong

  • Every request touches 4+ services synchronously β€” if a single user action (e.g. "place order") requires a long synchronous chain through many services before responding, the split is too fine-grained for the actual coupling between those steps (this is exactly the "chatty synchronous chain" failure mode from Why Microservices Fail).
  • Two services are always deployed together β€” if Service A can never actually ship independently of Service B (their APIs or data models are too tightly coupled), they're not really two services; they're one service with an unnecessary network hop in the middle.
  • A single database table is written by two different services β€” this is the clearest possible signal of a wrong boundary (see Data Ownership Model) β€” it means the split didn't actually separate the data, only the code.

Stating the decomposition explicitly in an interview

A strong interview answer names the services and the reasoning: "I'm splitting Order and Inventory into separate services because they have different scaling profiles β€” Inventory reads dominate at 100x the write rate, Order is write-heavy and needs strong consistency for the order state machine β€” and different consistency needs, which argues for them being independently scalable and independently deployable." Naming why a boundary exists (not just drawing it) is what distinguishes decomposition from decoration.

Follow-up questions this topic invites β€” and their answers

Q: How many services is 'too many' for a given system? A: There's no fixed number β€” the right question isn't service count but whether each service is independently valuable to split out (different scaling needs, different team ownership, different deployment cadence); splitting purely for the sake of having more, smaller services without a concrete driver adds coordination overhead for no real benefit.

Q: What if a business capability is genuinely too small to justify its own service? A: It's reasonable to keep it as a module within a larger service initially and extract it later once it has a clear independent scaling or ownership need β€” premature decomposition into a service that's called by only one other service and has no independent scaling story is itself a design smell, not a virtue.

Q: How does domain decomposition interact with the database-per-service pattern? A: They're the same decision viewed from two angles β€” a correct bounded-context split naturally implies each service owns its own data store (see Data Ownership Model); if the proposed services would need to share a database to function, that's a strong signal the decomposition boundary itself is wrong, not just an implementation detail to work around.

Q: Can decomposition change over a system's lifetime? A: Yes, and this is expected β€” a system's early bounded contexts are often merged or re-split as real usage patterns and team structure become clear; the framework's job is to produce a defensible starting boundary given current requirements, not a permanent, unchangeable structure.

Previous

Requirement Gathering Practice

Next

API Contract Design

AI Tutor

Lesson: Domain Decomposition

Quick actions

AI responses can be inaccurate. Verify critical information.