Design Patterns for Microservice Architecture – Database per Microservice
Once a company replaces the large monolithic system with many smaller microservices, the most important decision it faces is regarding the Database. In a monolithic architecture, a large, central database is used. Many architects favor keeping the database as it is, even when they move to microservice architecture. While it gives some short-term benefit, it is an anti-pattern, especially in a large-scale system, as the microservices will be tightly coupled in the database layer. The whole object of moving to microservice will fail (e.g., team empowerment, independent development).
A better approach is to provide every Microservice its own Data store, so that there is no strong-coupling between services in the database layer. Here I am using the term database to show a logical separation of data, i.e., the Microservices can share the same physical database, but they should use separate Schema/collection/table. It will also ensure that the Microservices are correctly segregated according to the Domain-Driven-Design.
- Complete ownership of Data to a Service.
- Loose coupling among teams developing the services.
- Sharing data among services becomes challenging.
- Giving application-wide ACID transactional guarantee becomes a lot harder.
- Decomposing the Monolith database to smaller parts need careful design and is a challenging task.
When to use Database per Microservice
- In large-scale enterprise applications.
- When the team needs complete ownership of their Microservices for development scaling and development velocity.
When not to use Database per Microservice
- In small-scale applications.
- If one team develops all the Microservices.
Enabling Technology Examples
All SQL, NoSQL databases offer logical separation of data (e.g., separate tables, collections, schemas, databases).