Managing Data in Microservices

1. Database per Service Pattern

RuleDetail
OwnershipEach service exclusively owns its DB schema
AccessOther services use APIs/events; never direct SQL
Tech ChoiceEach service picks fit-for-purpose DB (polyglot)
CostNo cross-service joins; eventual consistency

2. Shared Database Anti-Pattern

SymptomConsequence
Multiple services write same tablesSchema changes block all teams
Hidden coupling via SQLRefactor breaks other services silently
Lock contentionPerformance suffers across services
Single point of failureDB outage = all services down
Warning: A shared database is the #1 way "microservices" devolve into a distributed monolith.

3. Polyglot Persistence Pattern

WorkloadRecommended Store
Transactional CRUDPostgreSQL, MySQL
Document / flexible schemaMongoDB, DynamoDB
Cache / sessionRedis, Memcached
SearchElasticsearch, OpenSearch
Time-seriesInfluxDB, TimescaleDB
GraphNeo4j, Neptune
Wide-column / scaleCassandra, ScyllaDB, Bigtable
Event logKafka, EventStoreDB

4. CQRS Pattern

SideResponsibility
Command SideValidates + executes state changes; writes to write model
Query SideOptimized read models; denormalized for queries
SyncEvents flow from write to read model (eventually consistent)
ProsIndependent scaling, optimized schemas, complex query support
ConsComplexity; eventual consistency UX

5. Materialized View Pattern

AspectDetail
DefinitionPre-computed read-optimized view kept in sync via events
StorageOwned by query service (Redis, Elasticsearch, RDBMS)
SyncSubscribed to source events; updated on each event
RebuildReplay event stream from beginning

Example: Customer Order Summary View

@KafkaListener(topics = "orders.placed")
public void onOrderPlaced(OrderPlaced e) {
    summaryRepo.upsert(e.customerId(), s -> {
        s.orderCount++;
        s.lifetimeValue = s.lifetimeValue.add(e.total());
        s.lastOrderAt = e.occurredAt();
    });
}

6. Data Replication Pattern

TypeMechanism
Event-Driven ReplicaSubscribe to source events, maintain local copy
CDC ReplicaStream DB log changes to consumers
Snapshot + DeltaInitial bulk load + ongoing CDC
DB-Level ReplicationNative primary→replica (read replicas only)

7. Transaction Log Tailing Pattern

AspectDetail
SourceDatabase WAL/binlog
ToolsDebezium, AWS DMS, Maxwell
OutputKafka topic of row-level change events
Use CaseOutbox-less event publishing, replication

8. Change Data Capture Pattern

AspectDetail
DefinitionCapture row-level INSERT/UPDATE/DELETE as events
MethodsLog-based (preferred), trigger-based, query-based
Use CasesSync to data warehouse, search index, cache, downstream services
CaveatCouples consumers to internal schema; prefer Outbox for domain events

9. Data Mesh Pattern

PrincipleDetail
Domain-Owned DataDomain teams own their analytical data products
Data as ProductDiscoverable, addressable, trustworthy, self-describing
Self-Serve PlatformCentral platform team provides infra primitives
Federated GovernanceOrg-wide standards; domain autonomy on impl

10. Data Lake Pattern

AspectDetail
StorageRaw data in object store (S3, GCS, ADLS)
FormatParquet, ORC, Iceberg, Delta Lake, Hudi
QueryAthena, BigQuery, Spark, Trino, Presto
PatternServices emit events → land in lake → analytics, ML