geometrix - Fotolia
As an organization's application portfolio grows in size and complexity, developers must start to rely on software design patterns that facilitate continuous development and seamless communication between components. Orchestration is just one of many architectural patterns for distributed systems, but it plays a huge role in architectural readability and workload management. For that reason alone, it can be a perfect fit for a growing software environment that hopes to tackle long-term scalability.
Let's look at some of the primary benefits of microservices orchestration patterns, as well as the frameworks and tooling today's development shops can use.
Basic steps of orchestration
At its core, orchestration is a pattern that favors a centralized application workflow. In an orchestration-driven architecture, software transactions are translated directly into workflows, which are subsequently identified and managed by an orchestrator system. Eventually, services and APIs will start to trigger the orchestrator to execute the steps of particular workflows. The orchestrator will also manage payload construction, transformation and protocol interoperability.
One of the biggest strengths of the orchestration pattern is the ability to deal with a mix of communication types. Once a workflow's execution is complete, the orchestrator will send either a success or a failure message to the consuming service or API. Whether this messaging needs to be handled synchronously, asynchronously or as a mix of the two, the orchestrator can handle it.
Benefits of microservices orchestration
Orchestration is particularly important when it comes to dealing with distributed architecture styles like microservices. Let's look at some of the specific benefits of orchestration in a microservices architecture.
Architectural readability. The orchestration pattern aims to centralize workflow management, which offers a lot in terms of simplifying an architecture. Developers can query these workflows to identify individual service responsibilities without the need to understand details about the overarching application platform. This pattern also separates business logic from the boilerplate code that dictates the steps of a workflow, meaning that services can focus on their functionality rather than the complex details of the workflow sequence. This can also facilitate scenarios where the sequencing of service can change for different tenants, regions and more as shown in the figure below.
Evolution of communication protocols. Synchronous architecture offers more flexibility around builds and changes but does so at the expense of high concurrency and throughput. Asynchronous architectures offer more resilience at scale, but they are also harder to debug. To mitigate the tradeoff, the orchestration pattern abstracts services in such a way that they can start messaging synchronously, and shift to asynchronous as the service grows and integrations become more complex.
Payload versioning and management. An orchestrator can handle transformation between service payloads. Since all payload contracts are managed centrally, changes and new versions are easy to track, locate and manage. The orchestrator can also help transform data formats and messaging protocols, which affords distributed services a much-needed flexibility when it comes to communications.
Self-healing and regulation of load. Orchestrators provide centralized flow-control mechanisms that help automatically mitigate potential service overloads. To assist with workload management, orchestrators use circuit breaker mechanisms that automatically freeze and retry failed services and service calls.
Observability. To implement operational transparency, the orchestrator can trace and report system health at each service level. This provides application managers much-needed observability that makes it easy to flag offending services. With this in place, it is also possible to expose business metrics and SLAs which can be very useful.
Key orchestrator characteristics
Often one of the arguments against the orchestrator pattern is that it can be a central point of failure. However, replication and load balancing address that concern as long as the underlying orchestrator and associated data store scale linearly. To ensure that orchestration design succeeds in a distributed architecture, the orchestrator must possess some characteristics.
- Stateless. The orchestrator should be stateless to support linear scaling.
- Persisted data store. To ensure statelessness, an orchestrator needs a persisted data store for workflow payloads.
- Sharding. A sharded design can improve overall performance but is only necessary if an environment requires very high throughput.
- Archival policy. To prevent data loss, orchestrators that deal with high volumes of traffic should have an archival policy in place for completed service requests.
Frameworks and tooling for microservices orchestration
Orchestration needs to address the nuances of communication patterns and protocols. It leverages centralized traffic flow to provide visibility into business and infrastructure metrics. Additionally, a good design orchestrator needs to operate with minimal overhead while still providing load regulation and circuit-breaker capabilities
There are traditional enterprise integration frameworks for orchestration, such as Spring Integration and Apache Camel, which developers can retrofit into their existing environments. However, a framework purpose-built for orchestration is a lot more suitable. The Uber Cadence library is one such framework. While Cadence relies on client libraries for microservices, participating services can be orchestration agnostic.