Archive

The Dulin Report

Browsable archive from the WordPress export.

Results (27)

Strategic activity mapping for software architects May 25, 2025 On the role of Distinguished Engineer and CTO Mindset Apr 27, 2025 My giant follows me wherever I go Sep 20, 2024 The day I became an architect Sep 11, 2024 Form follows fiasco Mar 31, 2024 On Amazon Prime Video’s move to a monolith May 14, 2023 One size does not fit all: neither cloud nor on-prem Apr 10, 2023 Comparing AWS SQS, SNS, and Kinesis: A Technical Breakdown for Enterprise Developers Feb 11, 2023 Why you should question the “database per service” pattern Oct 5, 2022 Monolithic repository vs a monolith Aug 23, 2022 All developers should know UNIX Jun 30, 2022 There is no such thing as one grand unified full-stack programming language May 27, 2022 Most terrifying professional artifact May 14, 2022 Best practices for building a microservice architecture Apr 25, 2022 TypeScript is a productivity problem in and of itself Apr 20, 2022 Tools of the craft Dec 18, 2021 TDWI 2019: Architecting Modern Big Data API Ecosystems May 30, 2019 Which AWS messaging and queuing service to use? Jan 25, 2019 Let’s talk cloud neutrality Sep 17, 2018 What does a Chief Software Architect do? Jun 23, 2018 Singletons in TypeScript Jul 16, 2017 Online grocers have an additional burden to be reliable Jan 5, 2017 What can we learn from the last week's salesforce.com outage ? May 15, 2016 IT departments must transform in the face of the cloud revolution Nov 9, 2015 Top Ten Differences Between ActiveMQ and Amazon SQS Sep 5, 2015 What can Evernote Teach Us About Enterprise App Architecture Apr 2, 2015 Docker can fundamentally change how you think of server deployments Aug 26, 2014

Why you should question the “database per service” pattern

October 5, 2022

Questioning experts is a good thing. I question the idea that in a single application, each service must have its database. I think the database per service concept has been quite damaging to software architecture for many years.



What problem is this pattern serving that cannot be solved by a modern relational database? Let’s examine




Services must be loosely coupled so that they can be developed, deployed and scaled independently

https://microservices.io/patterns/data/database-per-service.html



I agree, but that is not an argument for overcomplicating your database.




Some business transactions must enforce invariants that span multiple services. For example, the Place Order use case must verify that a new Order will not exceed the customer’s credit limit. Other business transactions, must update data owned by multiple services.

https://microservices.io/patterns/data/database-per-service.html



Sure, but if your business logic involves transactions that span data owned by multiple services, perhaps the most reliable way to use transactions is to use RDBMS capabilities.




Some business transactions need to query data that is owned by multiple services. For example, the View Available Credit use must query the Customer to find the creditLimit and Orders to calculate the total amount of the open orders.

https://microservices.io/patterns/data/database-per-service.html



Again, if your business transactions need to query data owned by multiple services, you are complicating your life and productivity by separating a database per each service. I guarantee that even if you twist yourself into a pretzel at the onset of the project to avoid this, eventually, you will be pressured into supporting queries across services in a transactional fashion.




Some queries must join data that is owned by multiple services. For example, finding customers in a particular region and their recent orders requires a join between customers and orders.

https://microservices.io/patterns/data/database-per-service.html



To me, this reads as another argument for not splitting up the database.




Databases must sometimes be replicated and sharded in order to scale

https://microservices.io/patterns/data/database-per-service.html



A modern RDBMS can do that just fine.




Different services have different data storage requirements. For some services, a relational database is the best choice. Other services might need a NoSQL database such as MongoDB, which is good at storing complex, unstructured data, or Neo4J, which is designed to efficiently store and query graph data.

https://microservices.io/patterns/data/database-per-service.html



A modern RDBMS can do most of the above. As an architect, if you are sitting there in your silo creating a witch’s brew of a soup that involves multiple database technologies, perhaps you should re-examine both your sanity and your architecture.



I am not a fan of the database per service model. The correct pattern for the database model in a cloud-native environment is a data abstraction layer that hides the underlying database mechanics while allowing for transactions that span multiple services. The services should not know the architecture of the database, nor should they orchestrate their transactions.