DEV Community

Cover image for 4 Microservice Patterns Crucial in Microservices Architecture
Riza Farheen for orkes

Posted on • Updated on • Originally published at orkes.io

4 Microservice Patterns Crucial in Microservices Architecture

The application industry witnessed a booming growth in the adoption of microservices architecture over the past few years. As enterprises increasingly embark on their microservices journey, understanding common architectural patterns becomes paramount when designing software at scale.

The promise of Microservices orchestration to bring adaptability, reliability and scalability should not be at the cost of integrating more complexity or introducing a “proprietary system” feeling to development teams. On the contrary, a platform like Orkes Conductor helps developers to implement proven microservices architecture best practices using patterns while having the freedom to use their preferred programming languages.

This blog gives a quick overview of four significant microservice patterns that can be implemented using Orkes Conductor.

CQRS Pattern with Event Sourcing

Command and Query Response Segregation (CQRS) is a design pattern in microservices that separates the read and write operations in an application. A CQRS system has 2 components:

  • Command - The write operation that changes the object's internal state but returns nothing or meta-data only.
  • Query - The read operation that returns the information but doesn’t change the internal state.

On the other hand, event sourcing is a data storage pattern that focuses on storing the changes in an application’s state as a series of events. Instead of storing the current state, the event sourcing stores and maintains the log of events. This method has several advantages, such as data consistency, audit trail, etc.

  • Data Consistency - Since all the changes in an application are recorded as events, you can flexibly rebuild the current state at any time by replaying these events. It helps ensure data consistency and eliminates the issues that may occur due to concurrent writes.
  • Audit Trail - Since the event log captures the history of all actions within the application, this record can be used for debugging, compliance checking, and auditing purposes.

In simple terms, CQRS separates reading and writing data, while Event Sourcing stores data as a series of events to ensure data consistency and maintain an audit trail of all actions in an application. These two patterns can be used together to create robust and scalable microservices architectures.

Strangler Pattern

The predominant use of strangler patterns in microservices architecture comes into use when migrating from monolithic to microservice-based architecture. The strangler pattern helps update your applications from monolithic to microservices while running in production.

To better understand the concept, consider that your house needs an extensive renovation. You have two options here: one is completely demolishing the house and constructing a brand new one from scratch, which would take months. However, this approach comes with significant uncertainties. You can't be entirely certain that the new house will meet your expectations and you won't be able to live in it during the reconstruction period.

The second choice is to undertake a step-by-step renovation, where you can refurbish one area at a time, ensuring each section meets your expectations before moving on to the next. This approach is convenient as you can continue living in the house as you carry out these upgrades. Also, if the renovation is not up to your expectations, it’s much simpler to rectify the issues as you’re only addressing one part at a time. Over time, you'll have a fully updated house that never really stopped being home, and you'll have significantly reduced the risks and disruptions associated with a total rebuild.

When it comes to application migration, i.e., if you are migrating your applications from monolithic to microservices, you can adapt the strangler pattern. Here, instead of completely dissembling your application and rewriting the entire code, you can update sections without taking down the application. Continuing this process, you can eventually migrate all the services and components to integrate with your new application system, retiring the legacy application.

The Strangler Pattern is essential for modernization efforts because it allows organizations to evolve their legacy monolithic systems without having to rewrite them entirely from scratch. This is crucial for avoiding the risks and resource-intensive nature of a complete rewrite.

The strangler pattern comes with several benefits:

  • It reduces the risk of completely rewriting the application code.
  • Helps in migrating microservice architecture step by step without disrupting the entire application functionality.
  • Cost-effective as it gradually modernizes a monolith rather than starting from scratch. It maximizes the reuse of existing code and resources.
  • Provides flexibility in choosing which parts of the monolith to modernize, allowing businesses to focus on the most critical areas first.

The Strangler Pattern is a valuable approach for modernizing monolithic applications while minimizing risks and disruptions. It allows organizations to take a step-by-step approach to migrate to a more agile and scalable microservices architecture, making it a popular choice in modernization efforts.

Publisher / Subscriber Pattern

The Publisher / Subscriber Pattern, commonly called the Pub / Sub pattern, is a microservice pattern that enables loose coupling between components that allows them to communicate between them. The pub & sub rely on some message brokers to send messages between them.

In this pattern, the publishers produce the messages, and the subscribers receive them and act upon them without any direct, explicit connections between them. This type of communication is helpful in scalability, flexibility, and decoupling in communication. The typical pub/sub pattern has three main components: publisher, subscriber, and message brokers.

Publishers produce events or messages without knowing who or what will consume them. Subscribers express interest in specific types of messages and react when relevant messages are published. This asynchronous, event-driven nature ensures that microservices can respond to events in real time without blocking or waiting for responses.

The social media apps you use daily are a great example of how the Pub/Sub pattern is implemented in the real world.

In social media apps, publishers are responsible for generating events or messages. These events include uploading a photo, posting a status update, etc. Each action generates events that need to be disseminated to interested people. The publisher’s role is to produce these events without knowing who or what will consume them. They send the events to the message broker.

Now, the subscribers in the social media apps are the users and various components of the platform, such as their notification system, chat services, and feed algorithm. The users are subscribers who express interest in specific types of content or users by following, liking, or commenting on posts. They react when relevant events are published. For example, when you follow a user, you subscribe to their posts and receive updates when they publish new content. Subscribers react to events by displaying them in your feed, sending notifications, or updating chat conversations.

The message brokers act as the intermediaries that route events from publishers to subscribers. It ensures that events are efficiently delivered to the right subscribers. Social media involves distributing events to followers, sending notifications to users, and managing real-time chat messages. Message brokers help scale the system by efficiently handling the distribution of events.

Saga Pattern

The most popular microservice pattern is the saga pattern used for managing distributed transactions and orchestrating complex, long-running processes. It is useful in managing distributed transactions in microservices, where traditional ACID transactions are challenging to implement due to the distributed and decentralized nature of microservices.

Distributed transactions can be problematic in microservices due to issues like two-phase commit, leading to high latency and potential failures. Sagas breaks down a large transaction into smaller, individual transactions within each microservice, ensuring that each service can perform its part independently without requiring coordination from a central authority.

Sagas help orchestrate complex, long-running processes by defining steps and compensating actions to handle failures gracefully. For example, in an e-commerce application, a Saga might manage the process of placing an order, involving services for inventory, payment, and shipping. If any step fails, a compensating action can be triggered to handle the failure.

In my previous blog on Saga Pattern, I’ve discussed in detail on how you can implement the saga pattern using Orkes Conductor in the context of a cab booking application. Refer to the blog for detailed code samples and examples.

Conclusion

In a nutshell, depending on the business use case & requirements, you can implement any microservice pattern using Orkes Conductor.

Conductor, built at Netflix and maintained by Orkes, is a powerful Open Source orchestration platform for building scalable distributed applications 10x faster. Conductor is quite flexible, and you can pretty much implement any of the microservice patterns seamlessly.

At Orkes, we offer Orkes Cloud, the enterprise version of Conductor, in all major cloud platforms, including AWS, Azure & GCP.

Get Started with Orkes Playground & Orkes Cloud!

Also, don’t forget to give us a ⭐ on our Conductor repo.

Top comments (0)