Consider, the FTGO application, which is an online food delivery application.
A client of application creates an order by making an HTTP
POST /orders request and expects a response, say, within 600ms.
Because the FTGO application uses the microservice architecture, the responsibilities that implement order creation are scattered across multiple services.
POST request is first routed to the
Order Service, which must then collaborate with the following services:
Restaurant Service- knows the restaurant’s menu and prices
Consumer Service- knows the state of the
Consumerthat places the order
Kitchen Service- creates a
Ticket, which tells the chef what to cook
Accounting Service- authorizes the consumer’s credit card
Order Service could invoke each of these services using synchronous request/response.
It might, for example, implement the inter-service communication using REST or gRPC.
However, a key drawback of using synchronous request/response is that it reduces availability.
That’s because if any of the
Order Sevice’s collaborators are unavailable, it will not be able to create the order and must return an error to the client.
An alternative approach is to eliminate all synchronous communication between the
Order Service and its collaborators by using the CQRS and Saga patterns.
Order Service can use the CQRS pattern to maintain a replica of the restaurant menu’s and there by eliminate the need to synchronously fetch data from the
It can validate the order asynchronously by using the Saga pattern.
Order Service creates an
Order in a
PENDING state and sends back a response to the
It then completes the creation of the order by communicating asynchronously with the other services.
A key benefit of this approach is that it improves availability.
Order Service always respond to a
POST /orders request even when one of the other services is unavailable.
One drawback, however, of using a saga to complete the creation of the order is that the response to the
POST doesn’t tell the client whether the order was approved.
The client must find out by periodically invoking
How should a service collaborate with other services when handling a synchronous request?
Design a service so that it can respond to a synchronous request without waiting for the response from any other service.
One way to make a service self-contained is to implement needed functionality as a service module rather than a separate service.
We could, for example, merge the
Order Service and
Another way to make a service self-contained is for it to collaborate with other services using the CQRS and the Saga patterns. A self-contained service uses the Saga pattern to asynchronously maintain data consistency. It uses the CQRS pattern to maintain a replica of data owned by other services.
Order Service in the FTGO application described earlier is an example of a self-contained service.
createOrder() operation, for example, queries a CQRS replica of data owned by the
Restaurant Service to validate and price the order, and then initiates a saga to finish the creation of the order.
This pattern has the following benefits:
This pattern has the following drawbacks:
Microservices.io is brought to you by Chris Richardson. Experienced software architect, author of POJOs in Action, the creator of the original CloudFoundry.com, and the author of Microservices patterns.
Chris helps clients around the world adopt the microservice architecture through consulting engagements, and training classes and workshops.
Chris offers numerous resources for learning the microservice architecture.
Chris teaches comprehensive workshops and training classes for executives, architectures and developers to help your organization use microservices effectively.
Avoid the pitfalls of adopting microservices and learn essential topics, such as service decomposition and design and how to refactor a monolith to microservices.
Want to see an example? Check out Chris Richardson's example applications. See code
Engage Chris to create a microservices adoption roadmap and help you define your microservice architecture,
Use the Eventuate.io platform to tackle distributed data management challenges in your microservices architecture.
Eventuate is Chris's latest startup. It makes it easy to use the Saga pattern to manage transactions and the CQRS pattern to implement queries.
Join the microservices google group
Application architecture patterns
Cross cutting concerns