Database per service, consistency patterns, and distributed data
One of the biggest challenges: each microservice should own its data. No sharing databases!
Each microservice has its own database. Other services can't access it directly - they must use the service's API.
# Order Service - PostgreSQL (Relational)
order_db = PostgreSQL({
"host": "order-db",
"database": "orders"
})
# Product Catalog - MongoDB (Document)
catalog_db = MongoDB({
"host": "catalog-db",
"database": "products"
})
# Session Store - Redis (Key-Value)
session_db = Redis({
"host": "session-db"
})
Order Service needs customer data, but Customer Service owns it. How do we keep data in sync?
Solutions:
Techniques for maintaining data consistency across services.
Capture database changes and stream them to other services.
{
"name": "customer-connector",
"config": {
"connector.class": "io.debezium.connector.postgresql.PostgresConnector",
"database.hostname": "customer-db",
"database.port": "5432",
"database.user": "debezium",
"database.dbname": "customers",
"table.include.list": "public.customers",
"topic.prefix": "customer-events"
}
}
Accept that data won't be immediately consistent across all services - it will become consistent eventually.
| Pattern | Consistency | Availability | Use Case |
|---|---|---|---|
| Strong Consistency | Immediate | Lower | Banking transactions |
| Eventual Consistency | Delayed | Higher | Social media likes |
Sophisticated approaches for data management at scale.
Use different database technologies for different services based on their needs.
# User Service: PostgreSQL for relational data
users = PostgreSQL("user-db")
# Product Catalog: Elasticsearch for full-text search
products = Elasticsearch("product-search")
# Shopping Cart: Redis for fast key-value access
cart = Redis("cart-cache")
# Analytics: Cassandra for time-series data
analytics = Cassandra("analytics-db")
# File Storage: S3 for large objects
files = S3("file-bucket")
Treat data as a product, with domain teams owning their data end-to-end.