Back to Blog
Architecture12 min readFebruary 15, 2026

Microservices Data Architecture: Patterns & Pitfalls

Database-per-service, CQRS, event sourcing, and the Saga pattern. How to manage data in distributed systems.

The data challenge in microservices

Microservices distribute business logic across independently deployable services. Each service owns its data — but analytics, reporting, and cross-service queries demand a unified view. Bridging this gap without coupling services is the central architectural challenge.

Database-per-service pattern

Each microservice has its own database, chosen to match its access patterns — PostgreSQL for relational data, DynamoDB for key-value lookups, Elasticsearch for search. No direct database sharing between services.

Trade-off: Full autonomy but no cross-service JOINs. You need an API layer or event-based integration for cross-service data access.

Event sourcing

Instead of storing current state, store a sequence of domain events (OrderPlaced, OrderShipped, OrderCancelled). Current state is derived by replaying events. This provides a complete audit trail and enables temporal queries.

Best for: Financial systems, order management, and compliance-heavy domains where history matters.

CQRS (Command Query Responsibility Segregation)

Separate the write model (optimized for updates) from the read model (optimized for queries). An event bus syncs changes from the write side to materialized read views. Each view can use a different storage engine.

Best for: Systems with asymmetric read/write loads — 90% reads, 10% writes — and complex query requirements.

Build your architecture diagram now

Datadef generates professional diagrams with AI — 2,000+ cloud icons, column-level data lineage, and an MCP server your coding agent can drive.

Saga pattern for distributed transactions

Without distributed transactions, you need sagas: a sequence of local transactions across services. If one step fails, compensating transactions undo previous steps. Choreography (event-driven) or orchestration (central coordinator) are the two implementation approaches.

API composition for cross-service queries

An API gateway or BFF (Backend-for-Frontend) aggregates data from multiple services into a single response. Simple to implement but can create latency chains and tight coupling if overused.

Materialized views with CDC

Use Change Data Capture to stream changes from each service's database into a centralized analytics store (data warehouse or lakehouse). Services remain decoupled; analytics gets a unified view. This is the most common pattern for building data platforms on top of microservices.

Documenting microservices data flows

With dozens of services, databases, queues, and event topics, understanding data flow becomes impossible without visual documentation. Datadef's lineage tracking connects sources through transformations to consumption layers, giving you a live map of your microservices data architecture.