Bird
Raised Fist0
Microservicessystem_design~10 mins

Database per service pattern in Microservices - Scalability & System Analysis

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Scalability Analysis - Database per service pattern
Growth Table: Database per Service Pattern
UsersServicesDatabasesData VolumeTrafficComplexity
100 users5-105-10 small DBsLow (MBs)Low (few QPS)Simple coordination
10,000 users10-2010-20 medium DBsMedium (GBs)Medium (hundreds QPS)Need service discovery, monitoring
1,000,000 users20-5020-50 large DBsHigh (TBs)High (thousands QPS)Complex data consistency, backups
100,000,000 users50+50+ very large DBsVery High (PBs)Very High (tens of thousands QPS)Advanced sharding, cross-service sync
First Bottleneck

At small scale, the database for each service handles requests well. As users grow to thousands or millions, the first bottleneck is the database instance for a service. Each database can handle only so many queries per second (typically 5,000-10,000 QPS). When traffic grows, the database CPU, memory, or disk I/O saturates first.

Also, cross-service data consistency and communication overhead increase, causing latency and complexity.

Scaling Solutions
  • Horizontal scaling: Add more instances of the service and database replicas to distribute load.
  • Read replicas: Use read-only replicas to offload read queries from the primary database.
  • Database sharding: Split large databases by user ID or other keys to spread data and queries.
  • Caching: Use in-memory caches (like Redis) to reduce database hits for frequent reads.
  • Service isolation: Keep databases per service to avoid contention and allow independent scaling.
  • Asynchronous communication: Use message queues to decouple services and reduce synchronous DB calls.
  • Monitoring and automation: Track DB performance and automate scaling decisions.
Back-of-Envelope Cost Analysis

Assuming 1 million users generating 10,000 QPS total:

  • Each service DB handles ~200-500 QPS (if 20 services), within typical DB limits.
  • Storage per DB: 1 TB for user data and logs.
  • Network bandwidth: 10,000 QPS * 1 KB/request = ~10 MB/s total, manageable on 1 Gbps links.
  • Cache layer reduces DB load by 30-50%, saving CPU and I/O.
  • Adding replicas and shards increases infrastructure cost but improves availability and performance.
Interview Tip

When discussing scalability for database per service pattern, start by explaining the isolation benefits. Then identify the database as the first bottleneck as traffic grows. Discuss how to horizontally scale databases with replicas and sharding. Mention caching and asynchronous communication to reduce load. Finally, highlight monitoring and automation for proactive scaling.

Self Check

Question: Your database handles 1000 QPS. Traffic grows 10x to 10,000 QPS. What do you do first and why?

Answer: First, add read replicas to offload read queries from the primary database. This reduces CPU and I/O pressure. If writes also increase, consider sharding the database to distribute write load. Caching frequent reads can also help. This approach addresses the database bottleneck effectively.

Key Result
The database per service pattern isolates data per microservice, allowing independent scaling. The first bottleneck is the database instance's query capacity. Scaling requires horizontal scaling with replicas, sharding, caching, and asynchronous communication to handle millions of users and high QPS.

Practice

(1/5)
1. What is the main advantage of the Database per service pattern in microservices architecture?
easy
A. It reduces the number of databases needed in the system.
B. All services share the same database for easier data management.
C. Each service can be developed, deployed, and scaled independently.
D. It allows direct database access between services.

Solution

  1. Step 1: Understand the pattern's goal

    The Database per service pattern means each microservice owns its own database to avoid tight coupling.
  2. Step 2: Analyze the benefits

    This independence allows each service to be developed, deployed, and scaled without affecting others.
  3. Final Answer:

    Each service can be developed, deployed, and scaled independently. -> Option C
  4. Quick Check:

    Service independence [OK]
Hint: Database per service means independent databases per microservice [OK]
Common Mistakes:
  • Thinking all services share one database
  • Assuming database sharing improves independence
  • Believing it reduces total databases
2. Which of the following is the correct way for microservices to access data in the Database per service pattern?
easy
A. Directly query another service's database.
B. Use database triggers to sync data between services.
C. Share a common database connection pool.
D. Use APIs to communicate and request data from other services.

Solution

  1. Step 1: Recall communication rules in this pattern

    Services do not share databases; they communicate via APIs to maintain independence.
  2. Step 2: Identify correct data access method

    Using APIs ensures loose coupling and clear service boundaries.
  3. Final Answer:

    Use APIs to communicate and request data from other services. -> Option D
  4. Quick Check:

    API communication [OK]
Hint: Microservices talk via APIs, not direct DB access [OK]
Common Mistakes:
  • Trying to query other service databases directly
  • Assuming shared connection pools exist
  • Using database triggers for cross-service sync
3. Consider two microservices: OrderService and InventoryService, each with its own database. If OrderService needs to check stock before placing an order, what is the correct flow?
medium
A. OrderService sends an API request to InventoryService to get stock information.
B. InventoryService pushes stock updates to OrderService's database.
C. OrderService writes stock info to its own database and reads from there.
D. OrderService queries InventoryService's database directly to check stock.

Solution

  1. Step 1: Identify data ownership

    InventoryService owns stock data in its own database; OrderService cannot access it directly.
  2. Step 2: Determine communication method

    OrderService must call InventoryService's API to get current stock info.
  3. Final Answer:

    OrderService sends an API request to InventoryService to get stock information. -> Option A
  4. Quick Check:

    API call for data [OK]
Hint: Always use API calls to get data from other services [OK]
Common Mistakes:
  • Direct DB queries between services
  • Duplicating data in multiple databases
  • Relying on push updates to other service DBs
4. A developer tries to implement the Database per service pattern but notices data inconsistency between services. What is the most likely cause?
medium
A. Services are sharing the same database schema.
B. Services are directly querying each other's databases.
C. Services communicate asynchronously via APIs.
D. Each service has its own database and communicates via APIs.

Solution

  1. Step 1: Identify incorrect practice

    Directly querying another service's database breaks independence and can cause stale or inconsistent data.
  2. Step 2: Understand correct communication

    Services should communicate via APIs to keep data consistent and boundaries clear.
  3. Final Answer:

    Services are directly querying each other's databases. -> Option B
  4. Quick Check:

    Direct DB queries cause inconsistency [OK]
Hint: Avoid direct DB queries between services to prevent inconsistency [OK]
Common Mistakes:
  • Assuming shared schema is the problem
  • Thinking async API calls cause inconsistency
  • Believing separate DBs cause inconsistency
5. You are designing a microservices system with the Database per service pattern. How can you ensure data consistency across services when a transaction involves multiple services?
hard
A. Implement eventual consistency using event-driven communication and compensating actions.
B. Use distributed transactions with two-phase commit across all databases.
C. Allow services to share a single database to simplify transactions.
D. Synchronize databases by copying data between services periodically.

Solution

  1. Step 1: Understand distributed transaction challenges

    Two-phase commit is complex and reduces service independence, so it's rarely used in microservices.
  2. Step 2: Identify best practice for consistency

    Event-driven communication with eventual consistency and compensating actions allows services to stay independent and handle failures gracefully.
  3. Final Answer:

    Implement eventual consistency using event-driven communication and compensating actions. -> Option A
  4. Quick Check:

    Event-driven eventual consistency [OK]
Hint: Use events and compensations for cross-service consistency [OK]
Common Mistakes:
  • Trying distributed two-phase commit in microservices
  • Sharing a single database defeats independence
  • Periodic data copying causes stale data