SlideShare a Scribd company logo
@crichardson
Transactions and queries in
a microservice architecture
Chris Richardson
Founder of Eventuate.io
Founder of the original CloudFoundry.com
Author of POJOs in Action
@crichardson
chris@chrisrichardson.net
http://microservices.io
http://eventuate.io
http://plainoldobjects.com
Copyright © 2017. Chris Richardson Consulting, Inc. All rights reserved
@crichardson
Presentation goal
How to solve distributed data
management challenges in a
microservice architecture
@crichardson
About Chris
@crichardson
About Chris
@crichardson
About Chris
Consultant and trainer
focusing on modern
application architectures
including microservices
(http://www.chrisrichardson.net/)
@crichardson
About Chris
Founder of a startup that is creating
an open-source/SaaS platform
that simplifies the development of
transactional microservices
(http://eventuate.io)
@crichardson
For more information
http://learnmicroservices.io
@crichardson
Agenda
Distributed data challenges in a microservice architecture
Maintaining data consistency using sagas
Implementing queries using API composition and CQRS
The microservice architecture is an
architectural style that
structures an application as a
set of loosely coupled, services
organized around business
capabilities
@crichardson
A well-designed
microservice
Meaningful business functionality
Developed by a small team
Minimal lead time/high deployment
frequency
@crichardson
Goal: enable continuous
delivery of complex applications
@crichardson
Goal: enable continuous
delivery of complex applications
Process:
Continuous delivery/deployment
Organization:
Small, agile, autonomous,
cross functional teams
Architecture:
Microservice architecture
Enables
Enables
Enables
Successful
Software
Development
Services
=
testability
and
deployability
Team service(s)
@crichardson
Microservice architecture
Browser
Mobile
Device
Content
Router
API
Gateway
Catalog
Service
Review
Service
Order
Service
…
Service
Catalog
Database
Review
Database
Order
Database
…
Database
HTTP
/HTML
REST
REST
Browse &
Search WebApp
Product Detail
WebApp
….
Database per service
Private tables
Private schema
Private database server
Catalog
Service
Review
Service
Order
Service
…
Service
Catalog
Database
Review
Database
Order
Database
…
Database
Note: NOT per
service instance
@crichardson
Loose coupling requires
encapsulated data
Order Service Customer Service
Order Database Customer Database
Order table
Customer
table
orderTotal creditLimit
@crichardson
How to maintain data
consistency?!?!?
Invariant:
sum(open order.total) <= customer.creditLimit
@crichardson
Cannot use ACID transactions
BEGIN TRANSACTION
…
SELECT ORDER_TOTAL
FROM ORDERS WHERE CUSTOMER_ID = ?
…
SELECT CREDIT_LIMIT
FROM CUSTOMERS WHERE CUSTOMER_ID = ?
…
INSERT INTO ORDERS …
…
COMMIT TRANSACTION
Private to the
Order Service
Private to the
Customer Service
Distributed transactions
@crichardson
2PC is not an option
Guarantees consistency
BUT
2PC coordinator is a single point of failure
Chatty: at least O(4n) messages, with retries O(n^2)
Reduced throughput due to locks
Not supported by many NoSQL databases (or message brokers)
CAP theorem 2PC impacts availability
….
@crichardson
How to do queries?
@crichardson
Find recent, valuable
customers
SELECT *
FROM CUSTOMER c, ORDER o
WHERE
c.id = o.ID
AND o.ORDER_TOTAL > 100000
AND o.STATE = 'SHIPPED'
AND c.CREATION_DATE > ?
…. is no longer easy
Private to the
Order Service
Private to the
Customer Service
@crichardson
Microservices pattern
language: data patterns
http://microservices.io/
@crichardson
Agenda
Distributed data challenges in a microservice architecture
Maintaining data consistency using sagas
Implementing queries using API composition and CQRS
@crichardson
From a 1987 paper
@crichardson
Saga
Using Sagas instead of 2PC
Distributed transaction
Order Customer
Local transaction
Order
Local transaction
Customer
Local transaction
Order
Event
Event
X
@crichardson
Event-driven, eventually consistent
order processing
Order
Service
Customer
Service
Order created
Credit Reserved
Credit Check Failed
Create Order
OR
Customer
creditLimit
creditReservations
...
Order
state
total
…
create()
reserveCredit()
approve()/reject()
@crichardson
If only it were this easy…
@crichardson
Rollback using compensating
transactions
ACID transactions can simply rollback
BUT
Developer must write application logic to “rollback” eventually
consistent transactions
Careful design required!
@crichardson
Saga: Every Ti has a Ci
T1 T2 …
C1 C2
Compensating transactions
T1 T2 C1
FAILS
@crichardson
Order Service
Create Order Saga - rollback
Local transaction
Order
createOrder()
Customer Service
Local transaction
Customer
reserveCredit()
Order Service
Local transaction
Order
reject
order()
createOrder()
FAIL
Insufficient credit
@crichardson
Sagas complicate API design
Request initiates the saga. When to send back the response?
Option #1: Send response when saga completes:
+ Response specifies the outcome
- Reduced availability
Option #2: Send response immediately after creating the saga
(recommended):
+ Improved availability
- Response does not specify the outcome. Client must poll or be
notified
@crichardson
Revised Create Order API
createOrder()
returns id of newly created order
NOT fully validated
getOrder(id)
Called periodically by client to get outcome of validation
@crichardson
Minimal impact on UI
UI hides asynchronous API from the user
Saga execution usually appears to be instantaneous (<=
100ms)
If it takes longer UI displays “processing” popup
Server can push notification to UI
@crichardson
Sagas complicate the
business logic
Changes are committed by each step of the saga
Other transactions see “inconsistent” data, e.g. Order.state =
PENDING more complex logic
Interaction between sagas and other operations
e.g. what does it mean to cancel a PENDING Order?
“Interrupt” the Create Order saga
Wait for the Create Order saga to complete?
@crichardson
Maintainability of saga logic
Scattered amongst multiple services
Services consuming each other’s events cyclic
dependencies
@crichardson
Order Service
Orchestration-based saga coordination
Local transaction
Order
state=PENDING
createOrder()
Customer Service
Local transaction
Customer
reserveCredit()
Order Service
Local transaction
Order
state=APPROVED
approve
order()
createOrder()
CreateOrderSaga
@crichardson
Reliable sagas require
atomicity
Service
Database Message Broker
update publish
How
to make
atomic?
@crichardson
2PC still isn’t an option
@crichardson
Option #1: Use database
table as a message queue
ACID
transaction
See BASE: An Acid Alternative, http://bit.ly/ebaybase
DELETE
Customer
Service
ORDER_ID CUSTOMER_ID TOTAL
99
CUSTOMER_CREDIT_RESERVATIONS table
101 1234
ID TYPE DATA DESTINATION
MESSAGE table
84784 OrderCreated {…} …
INSERT INSERT
Message
Publisher
QUERY
Message
Broker
Publish
Local transaction
?
@crichardson
Publishing messages
Poll the MESSAGE table
OR
Tail the database transaction log
@crichardson
Option #2: Event sourcing:
event-centric persistence
Service
Event Store
save events
and
publish
Event table
Entity type
Event
id
Entity
id
Event
data
Order 902101 …OrderApproved
Order 903101 …OrderShipped
Event
type
Order 901101 …OrderCreated
Every state change event
@crichardson
Agenda
Distributed data challenges in a microservice architecture
Maintaining data consistency using sagas
Implementing queries using API composition and CQRS
@crichardson
Let’s imagine that you want to
retrieve the status of an order…
@crichardson
Order management is
distributed across services
Order Service
Order
status
Delivery Service
Delivery
status
Account Service
Bill
status
@crichardson
A join is no longer an option
SELECT *
FROM ORDER o, DELIVERY d, BILL b
WHERE o.id = ?
AND o.id = d.order_id
ABD o.id = b.order_id
Private to
each service
@crichardson
API Composition pattern
Order Service
Order
status
Delivery Service
Delivery
status
Account Service
Bill
status
API Gateway
GET /orders/id
GET /bill?orderId=idGET /orders/id GET /deliveries?orderId=id
@crichardson
API Composition works well in many situations
BUT
Some queries would require inefficient, in-memory joins of
large datasets
A service might only have PK-based API
@crichardson
Find recent, valuable
customers
SELECT *
FROM CUSTOMER c, ORDER o
WHERE
c.id = o.ID
AND o.ORDER_TOTAL > 100000
AND o.STATE = 'SHIPPED'
AND c.CREATION_DATE > ?
@crichardson
Using the API Composition pattern
Order Service
Order
status
orderTotal
Customer Service
Customer
status
creationDate
API Gateway
GET /orders/kind=recentHighValue
GET /customers?creationDateSince=date
GET /orders?status=SHIPPED
&orderTotalGt=10000
Inefficient 😢
@crichardson
Use Command Query
Responsibility Segregation
(CQRS)
@crichardson
Command Query Responsibility
Segregation (CQRS)
Application logic
Commands Queries
X
POST
PUT
DELETE
GET
@crichardson
Command Query Responsibility
Segregation (CQRS)
Command side
Commands
Aggregate
Event Store
Events
Query side
Queries
(Materialized)
View
Events
POST
PUT
DELETE
GET
@crichardson
Query side design
Event Store
Updater
View Updater
Service
Events
Reader
HTTP GET
Request
View Query
Service
View
Store
e.g.
MongoDB
ElasticSearch
Neo4J
update query
@crichardson
Persisting a customer and
order history in MongoDB
{
"_id" : "0000014f9a45004b 0a00270000000000",
"name" : "Fred",
"creditLimit" : {
"amount" : "2000"
},
"orders" : {
"0000014f9a450063 0a00270000000000" : {
"state" : "APPROVED",
"orderId" : "0000014f9a450063 0a00270000000000",
"orderTotal" : {
"amount" : "1234"
}
},
"0000014f9a450063 0a00270000000001" : {
"state" : "REJECTED",
"orderId" : "0000014f9a450063 0a00270000000001",
"orderTotal" : {
"amount" : "3000"
}
}
}
}
Denormalized = efficient lookup
Customer
information
Order
information
@crichardson
Queries database (type)
Command side
POST
PUT
DELETE
Aggregate
Event Store
Events
Query side
GET /customers/id
MongoDB
Query side
GET /orders?text=xyz
ElasticSearch
Query side
GET …
Neo4j
Benefits and drawbacks of
CQRS
Benefits
Necessary in an event sourced
architecture
Separation of concerns =
simpler command and query
models
Supports multiple denormalized
views
Improved scalability and
performance
Drawbacks
Complexity
Potential code duplication
Replication lag/eventually
consistent views
@crichardson
Summary
Microservices have private datastores in order to ensure loose
coupling
Transactions and querying is challenging
Use sagas to maintain data consistency
Implement queries using API composition when you can
Use CQRS for more complex queries
@crichardson
@crichardson chris@chrisrichardson.net
http://learnmicroservices.io
Questions?

More Related Content

PDF
Oracle Code Sydney - There is no such thing as a microservice!
PDF
Saturn2017: No such thing as a microservice!
PDF
YOW2018 - Events and Commands: Developing Asynchronous Microservices
PDF
Kong Summit 2018 - Microservices: decomposing applications for testability an...
PDF
Melbourne Jan 2019 - Microservices adoption anti-patterns: Obstacles to decom...
PDF
Oracle CodeOne 2019: Descending the Testing Pyramid: Effective Testing Strate...
PDF
Events on the outside, on the inside and at the core - Chris Richardson
PDF
There is no such thing as a microservice! (oracle code nyc)
Oracle Code Sydney - There is no such thing as a microservice!
Saturn2017: No such thing as a microservice!
YOW2018 - Events and Commands: Developing Asynchronous Microservices
Kong Summit 2018 - Microservices: decomposing applications for testability an...
Melbourne Jan 2019 - Microservices adoption anti-patterns: Obstacles to decom...
Oracle CodeOne 2019: Descending the Testing Pyramid: Effective Testing Strate...
Events on the outside, on the inside and at the core - Chris Richardson
There is no such thing as a microservice! (oracle code nyc)

What's hot (20)

PDF
SVCC Developing Asynchronous, Message-Driven Microservices
PDF
Oracle CodeOne 2019: Decompose Your Monolith: Strategies for Migrating to Mic...
PDF
SVCC Microservices: Decomposing Applications for Testability and Deployability
PDF
Omnikron webbinar - Microservices: enabling the rapid, frequent, and reliable...
PDF
Spring Days NYC - A pattern language for microservices
PDF
Mucon: Not Just Events: Developing Asynchronous Microservices
PDF
OReilly SACON2018 - Events on the outside, on the inside, and at the core
PDF
A Pattern Language for Microservices
PDF
microXchg: Managing data consistency in a microservice architecture using Sagas
PDF
Events to the rescue: solving distributed data problems in a microservice arc...
PDF
YOW! Perth: Cubes, Hexagons, Triangles, and More: Understanding the Microserv...
PDF
Oracle Code One: Events and commands: developing asynchronous microservices
PDF
Developing event-driven microservices with event sourcing and CQRS (london Ja...
PDF
An overview of the Eventuate Platform
PDF
QCONSF - ACID Is So Yesterday: Maintaining Data Consistency with Sagas
PDF
MicroCPH - Managing data consistency in a microservice architecture using Sagas
PDF
Mucon 2021 - Dark energy, dark matter: imperfect metaphors for designing micr...
PDF
GotoChgo 2019: Not Just Events: Developing Asynchronous Microservices
PDF
QConPlus 2021: Minimizing Design Time Coupling in a Microservice Architecture
PDF
Developing Event-driven Microservices with Event Sourcing & CQRS (gotoams)
SVCC Developing Asynchronous, Message-Driven Microservices
Oracle CodeOne 2019: Decompose Your Monolith: Strategies for Migrating to Mic...
SVCC Microservices: Decomposing Applications for Testability and Deployability
Omnikron webbinar - Microservices: enabling the rapid, frequent, and reliable...
Spring Days NYC - A pattern language for microservices
Mucon: Not Just Events: Developing Asynchronous Microservices
OReilly SACON2018 - Events on the outside, on the inside, and at the core
A Pattern Language for Microservices
microXchg: Managing data consistency in a microservice architecture using Sagas
Events to the rescue: solving distributed data problems in a microservice arc...
YOW! Perth: Cubes, Hexagons, Triangles, and More: Understanding the Microserv...
Oracle Code One: Events and commands: developing asynchronous microservices
Developing event-driven microservices with event sourcing and CQRS (london Ja...
An overview of the Eventuate Platform
QCONSF - ACID Is So Yesterday: Maintaining Data Consistency with Sagas
MicroCPH - Managing data consistency in a microservice architecture using Sagas
Mucon 2021 - Dark energy, dark matter: imperfect metaphors for designing micr...
GotoChgo 2019: Not Just Events: Developing Asynchronous Microservices
QConPlus 2021: Minimizing Design Time Coupling in a Microservice Architecture
Developing Event-driven Microservices with Event Sourcing & CQRS (gotoams)
Ad

Viewers also liked (20)

PDF
Docker Containers Deep Dive
PDF
Faible latence haut debit Devoxx FR 2014
PDF
Sortir de notre zone de confort
PPTX
Docker and Windows: The State of the Union
PPTX
Decouvrir son sujet grace à l'event storming
PPTX
.Net Microservices with Event Sourcing, CQRS, Docker and... Windows Server 20...
PDF
Coder sans peur du changement avec la meme pas mal hexagonal architecture
PDF
Decouvrir CQRS (sans Event sourcing) par la pratique
PDF
Ddd reboot (english version)
PDF
TDD is dead?!? Let's do an autospy (ncrafts.io)
PDF
Faible latence, haut debit PerfUG (Septembre 2014)
PPTX
The Velvet Revolution: Modernizing Traditional ASP.NET Apps with Docker
PPTX
Windows Containers and Docker: Why You Should Care
PDF
Culture craft humantalks
PDF
.NET Inside - Microservices, .NET Core e Serverless
PDF
Async await...oh wait!
PDF
CQRS without event sourcing
PDF
Building and deploying microservices with event sourcing, CQRS and Docker (Be...
PDF
Microservices Workshop All Topics Deck 2016
PDF
JavaOne2017: ACID Is So Yesterday: Maintaining Data Consistency with Sagas
Docker Containers Deep Dive
Faible latence haut debit Devoxx FR 2014
Sortir de notre zone de confort
Docker and Windows: The State of the Union
Decouvrir son sujet grace à l'event storming
.Net Microservices with Event Sourcing, CQRS, Docker and... Windows Server 20...
Coder sans peur du changement avec la meme pas mal hexagonal architecture
Decouvrir CQRS (sans Event sourcing) par la pratique
Ddd reboot (english version)
TDD is dead?!? Let's do an autospy (ncrafts.io)
Faible latence, haut debit PerfUG (Septembre 2014)
The Velvet Revolution: Modernizing Traditional ASP.NET Apps with Docker
Windows Containers and Docker: Why You Should Care
Culture craft humantalks
.NET Inside - Microservices, .NET Core e Serverless
Async await...oh wait!
CQRS without event sourcing
Building and deploying microservices with event sourcing, CQRS and Docker (Be...
Microservices Workshop All Topics Deck 2016
JavaOne2017: ACID Is So Yesterday: Maintaining Data Consistency with Sagas
Ad

Similar to Solving distributed data management problems in a microservice architecture (sfmicroservices) (20)

PDF
Saturn 2018: Managing data consistency in a microservice architecture using S...
PDF
Developing microservices with aggregates (SpringOne platform, #s1p)
PDF
Building microservices with Scala, functional domain models and Spring Boot (...
PDF
Building and deploying microservices with event sourcing, CQRS and Docker (Ha...
PDF
Building and deploying microservices with event sourcing, CQRS and Docker (QC...
PDF
ArchSummit Shenzhen - Using sagas to maintain data consistency in a microserv...
PPTX
Event Driven Microservices architecture
PDF
Building and deploying microservices with event sourcing, CQRS and Docker (Me...
PDF
Developing event-driven microservices with event sourcing and CQRS (phillyete)
PDF
Developing microservices with aggregates (melbourne)
PDF
Developing microservices with aggregates (devnexus2017)
PDF
Handling Eventual Consistency in JVM Microservices with Event Sourcing (javao...
PDF
Building and Deploying Microservices with Event Sourcing, CQRS and Docker
PDF
Building microservices with Scala, functional domain models and Spring Boot
PDF
Microservice
PDF
Developing event-driven microservices with event sourcing and CQRS (Shanghai)
PDF
Gluecon: Using sagas to maintain data consistency in a microservice architecture
PDF
#JaxLondon: Building microservices with Scala, functional domain models and S...
PDF
Building Microservices with Scala, functional domain models and Spring Boot -...
PDF
Developing event-driven microservices with event sourcing and CQRS (svcc, sv...
Saturn 2018: Managing data consistency in a microservice architecture using S...
Developing microservices with aggregates (SpringOne platform, #s1p)
Building microservices with Scala, functional domain models and Spring Boot (...
Building and deploying microservices with event sourcing, CQRS and Docker (Ha...
Building and deploying microservices with event sourcing, CQRS and Docker (QC...
ArchSummit Shenzhen - Using sagas to maintain data consistency in a microserv...
Event Driven Microservices architecture
Building and deploying microservices with event sourcing, CQRS and Docker (Me...
Developing event-driven microservices with event sourcing and CQRS (phillyete)
Developing microservices with aggregates (melbourne)
Developing microservices with aggregates (devnexus2017)
Handling Eventual Consistency in JVM Microservices with Event Sourcing (javao...
Building and Deploying Microservices with Event Sourcing, CQRS and Docker
Building microservices with Scala, functional domain models and Spring Boot
Microservice
Developing event-driven microservices with event sourcing and CQRS (Shanghai)
Gluecon: Using sagas to maintain data consistency in a microservice architecture
#JaxLondon: Building microservices with Scala, functional domain models and S...
Building Microservices with Scala, functional domain models and Spring Boot -...
Developing event-driven microservices with event sourcing and CQRS (svcc, sv...

More from Chris Richardson (18)

PDF
The microservice architecture: what, why, when and how?
PDF
More the merrier: a microservices anti-pattern
PDF
YOW London - Considering Migrating a Monolith to Microservices? A Dark Energy...
PDF
Dark Energy, Dark Matter and the Microservices Patterns?!
PDF
Dark energy, dark matter and microservice architecture collaboration patterns
PDF
Scenarios_and_Architecture_SkillsMatter_April_2022.pdf
PDF
Using patterns and pattern languages to make better architectural decisions
PDF
iSAQB gathering 2021 keynote - Architectural patterns for rapid, reliable, fr...
PDF
A pattern language for microservices - June 2021
PDF
Designing loosely coupled services
PDF
Microservices - an architecture that enables DevOps (T Systems DevOps day)
PDF
DDD SoCal: Decompose your monolith: Ten principles for refactoring a monolith...
PDF
Decompose your monolith: Six principles for refactoring a monolith to microse...
PDF
TDC2020 - The microservice architecture: enabling rapid, reliable, frequent a...
PDF
Overview of the Eventuate Tram Customers and Orders application
PDF
#DevNexus202 Decompose your monolith
PDF
JFokus: Cubes, Hexagons, Triangles, and More: Understanding Microservices
PDF
Decompose your monolith: strategies for migrating to microservices (Tide)
The microservice architecture: what, why, when and how?
More the merrier: a microservices anti-pattern
YOW London - Considering Migrating a Monolith to Microservices? A Dark Energy...
Dark Energy, Dark Matter and the Microservices Patterns?!
Dark energy, dark matter and microservice architecture collaboration patterns
Scenarios_and_Architecture_SkillsMatter_April_2022.pdf
Using patterns and pattern languages to make better architectural decisions
iSAQB gathering 2021 keynote - Architectural patterns for rapid, reliable, fr...
A pattern language for microservices - June 2021
Designing loosely coupled services
Microservices - an architecture that enables DevOps (T Systems DevOps day)
DDD SoCal: Decompose your monolith: Ten principles for refactoring a monolith...
Decompose your monolith: Six principles for refactoring a monolith to microse...
TDC2020 - The microservice architecture: enabling rapid, reliable, frequent a...
Overview of the Eventuate Tram Customers and Orders application
#DevNexus202 Decompose your monolith
JFokus: Cubes, Hexagons, Triangles, and More: Understanding Microservices
Decompose your monolith: strategies for migrating to microservices (Tide)

Recently uploaded (20)

PPTX
Agentic AI : A Practical Guide. Undersating, Implementing and Scaling Autono...
PDF
Wondershare Filmora 15 Crack With Activation Key [2025
PDF
Raksha Bandhan Grocery Pricing Trends in India 2025.pdf
PDF
System and Network Administration Chapter 2
PDF
SAP S4 Hana Brochure 3 (PTS SYSTEMS AND SOLUTIONS)
PPTX
ai tools demonstartion for schools and inter college
PDF
How Creative Agencies Leverage Project Management Software.pdf
PDF
How to Migrate SBCGlobal Email to Yahoo Easily
PPTX
Oracle E-Business Suite: A Comprehensive Guide for Modern Enterprises
PDF
Design an Analysis of Algorithms I-SECS-1021-03
PPTX
L1 - Introduction to python Backend.pptx
PPTX
ISO 45001 Occupational Health and Safety Management System
PDF
AI in Product Development-omnex systems
PDF
How to Choose the Right IT Partner for Your Business in Malaysia
PPTX
VVF-Customer-Presentation2025-Ver1.9.pptx
PDF
Why TechBuilder is the Future of Pickup and Delivery App Development (1).pdf
PDF
T3DD25 TYPO3 Content Blocks - Deep Dive by André Kraus
PPTX
Online Work Permit System for Fast Permit Processing
PPTX
ManageIQ - Sprint 268 Review - Slide Deck
PDF
System and Network Administraation Chapter 3
Agentic AI : A Practical Guide. Undersating, Implementing and Scaling Autono...
Wondershare Filmora 15 Crack With Activation Key [2025
Raksha Bandhan Grocery Pricing Trends in India 2025.pdf
System and Network Administration Chapter 2
SAP S4 Hana Brochure 3 (PTS SYSTEMS AND SOLUTIONS)
ai tools demonstartion for schools and inter college
How Creative Agencies Leverage Project Management Software.pdf
How to Migrate SBCGlobal Email to Yahoo Easily
Oracle E-Business Suite: A Comprehensive Guide for Modern Enterprises
Design an Analysis of Algorithms I-SECS-1021-03
L1 - Introduction to python Backend.pptx
ISO 45001 Occupational Health and Safety Management System
AI in Product Development-omnex systems
How to Choose the Right IT Partner for Your Business in Malaysia
VVF-Customer-Presentation2025-Ver1.9.pptx
Why TechBuilder is the Future of Pickup and Delivery App Development (1).pdf
T3DD25 TYPO3 Content Blocks - Deep Dive by André Kraus
Online Work Permit System for Fast Permit Processing
ManageIQ - Sprint 268 Review - Slide Deck
System and Network Administraation Chapter 3

Solving distributed data management problems in a microservice architecture (sfmicroservices)