CoreografiaChoreography

Cada componente do sistema participa do processo de tomada de decisão sobre o fluxo de trabalho de uma transação comercial, em vez de depender de um ponto central de controle.Have each component of the system participate in the decision-making process about the workflow of a business transaction, instead of relying on a central point of control.

Contexto e problemaContext and problem

Na arquitetura de microserviços, geralmente é o caso em que um aplicativo baseado em nuvem é dividido em vários serviços pequenos que trabalham juntos para processar uma transação de negócios de ponta a ponta.In microservices architecture, it’s often the case that a cloud-based application is divided into several small services that work together to process a business transaction end-to-end. Para reduzir o acoplamento entre serviços, cada serviço é responsável por uma única operação de negócios.To lower coupling between services, each service is responsible for a single business operation. Alguns benefícios incluem desenvolvimento mais rápido, base de código menor e escalabilidade.Some benefits include faster development, smaller code base, and scalability. No entanto, a criação de um fluxo de trabalho eficiente e escalonável é um desafio e, muitas vezes, requer comunicação complexa entre serviços.However, designing an efficient and scalable workflow is a challenge and often requires complex interservice communication.

Os serviços se comunicam entre si usando APIs bem definidas.The services communicate with each other by using well-defined APIs. Mesmo uma única operação de negócios pode resultar em várias chamadas ponto a ponto entre todos os serviços.Even a single business operation can result in multiple point-to-point calls among all services. Um padrão comum para a comunicação é usar um serviço centralizado que atue como o Orchestrator.A common pattern for communication is to use a centralized service that acts as the orchestrator. Ele reconhece todas as solicitações de entrada e Delega as operações para os respectivos serviços.It acknowledges all incoming requests and delegates operations to the respective services. Ao fazer isso, ele também gerencia o fluxo de trabalho de toda a transação comercial.In doing so, it also manages the workflow of the entire business transaction. Cada serviço apenas conclui uma operação e não está ciente do fluxo de trabalho geral.Each service just completes an operation and is not aware of the overall workflow.

O padrão Orchestrator reduz a comunicação ponto a ponto entre serviços, mas tem algumas desvantagens devido ao acoplamento rígido entre o orquestrador e outros serviços que participam do processamento da transação de negócios.The orchestrator pattern reduces point-to-point communication between services but has some drawbacks because of the tight coupling between the orchestrator and other services that participate in processing of the business transaction. Para executar tarefas em uma sequência, o orquestrador precisa ter algum conhecimento do domínio sobre as responsabilidades desses serviços.To execute tasks in a sequence, the orchestrator needs to have some domain knowledge about the responsibilities of those services. Se você quiser adicionar ou remover serviços, a lógica existente será interrompida e você precisará reconectar partes do caminho de comunicação.If you want to add or remove services, existing logic will break, and you'll need to rewire portions of the communication path. Embora você possa configurar o fluxo de trabalho, adicionar ou remover serviços facilmente com um orquestrador bem projetado, tal implementação é complexa e difícil de manter.While you can configure the workflow, add or remove services easily with a well-designed orchestrator, such an implementation is complex and hard to maintain.

Processando uma solicitação usando um orquestrador central

SoluçãoSolution

Permita que cada serviço decida quando e como uma operação comercial será processada, em vez de depender de um orquestrador central.Let each service decide when and how a business operation is processed, instead of depending on a central orchestrator.

Uma maneira de implementar o coreografia é usar o padrão de mensagens assíncronas para coordenar as operações de negócios.One way to implement choreography is to use the asynchronous messaging pattern to coordinate the business operations.

Processando uma solicitação usando um choreographer

Uma solicitação de cliente publica mensagens em uma fila de mensagens.A client request publishes messages to a message queue. À medida que as mensagens chegam, elas são enviadas por push aos assinantes ou serviços, interessados nessa mensagem.As messages arrive, they are pushed to subscribers, or services, interested in that message. Cada serviço assinado faz sua operação conforme indicado pela mensagem e responde à fila de mensagens com êxito ou falha da operação.Each subscribed service does their operation as indicated by the message and responds to the message queue with success or failure of the operation. No caso de sucesso, o serviço pode enviar uma mensagem de volta para a mesma fila ou para uma fila de mensagens diferente para que outro serviço possa continuar o fluxo de trabalho, se necessário.In case of success, the service can push a message back to the same queue or a different message queue so that another service can continue the workflow if needed. Se uma operação falhar, o barramento de mensagem poderá repetir essa operação.If an operation fails, the message bus can retry that operation.

Dessa forma, os serviços coreografarm o fluxo de trabalho entre si sem depender de um orquestrador ou com comunicação direta entre eles.This way, the services choreograph the workflow among themselves without depending on an orchestrator or having direct communication between them.

Como não há comunicação ponto a ponto, esse padrão ajuda a reduzir o acoplamento entre os serviços.Because there isn't point-to-point communication, this pattern helps reduce coupling between services. Além disso, ele pode remover o afunilamento de desempenho causado pelo orquestrador quando ele precisa lidar com todas as transações.Also, it can remove the performance bottleneck caused by the orchestrator when it has to deal with all transactions.

Quando usar esse padrãoWhen to use this pattern

Use o padrão coreografia se você espera atualizar, remover ou adicionar novos serviços com frequência.Use the choreography pattern if you expect to update, remove, or add new services frequently. Todo o aplicativo pode ser modificado com menos esforço e mínimo de interrupção para os serviços existentes.The entire app can be modified with lesser effort and minimal disruption to existing services.

Considere esse padrão se você tiver gargalos de desempenho no orquestrador central.Consider this pattern if you experience performance bottlenecks in the central orchestrator.

Esse padrão é um modelo natural para a arquitetura sem servidor, em que todos os serviços podem ser de curta duração ou controlados por evento.This pattern is a natural model for the serverless architecture where all services can be short lived, or event driven. Os serviços podem ser ativados por causa de um evento, realizar sua tarefa e são removidos quando a tarefa é concluída.Services can spin up because of an event, do their task, and are removed when the task is finished.

Problemas e consideraçõesIssues and considerations

A descentralização do Orchestrator pode causar problemas ao gerenciar o fluxo de trabalho.Decentralizing the orchestrator can cause issues while managing the workflow.

Se um serviço não conseguir concluir uma operação de negócios, poderá ser difícil se recuperar dessa falha.If a service fails to complete a business operation, it can be difficult to recover from that failure. Uma delas é fazer com que o serviço indique falha acionando um evento.One way is to have the service indicate failure by firing an event. Outro serviço assina esses eventos com falha para executar as ações necessárias, como aplicar Transações de compensação para desfazer operações bem-sucedidas em uma solicitação.Another service subscribes to those failed events takes necessary actions such as applying compensating transactions to undo successful operations in a request. O serviço com falha também pode falhar ao disparar um evento para a falha.The failed service might also fail to fire an event for the failure. Nesse caso, considere o uso de um mecanismo de repetição e de tempo limite para reconhecer essa operação como uma falha.In that case, consider using a retry and, or time out mechanism to recognize that operation as a failure. Para obter um exemplo, consulte a seção de exemplo.For an example, see the Example section.

É simples implementar um fluxo de trabalho quando você deseja processar operações de negócios independentes em paralelo.It's simple to implement a workflow when you want to process independent business operations in parallel. Você pode usar um único barramento de mensagem.You can use a single message bus. No entanto, o fluxo de trabalho pode se tornar complicado quando coreografia precisa ocorrer em uma sequência.However, the workflow can become complicated when choreography needs to occur in a sequence. Por exemplo, o serviço C pode iniciar sua operação somente depois que o serviço A e o serviço B concluíram suas operações com êxito.For instance, Service C can start its operation only after Service A and Service B have completed their operations with success. Uma abordagem é ter vários barramentos de mensagens que recebem mensagens na ordem necessária.One approach is to have multiple message buses that get messages in the required order. Para obter mais informações, consulte a seção de exemplo .For more information, see the Example section.

O padrão coreografia se tornará um desafio se o número de serviços crescer rapidamente.The choreography pattern becomes a challenge if the number of services grow rapidly. Considerando o alto número de partes de movimentação independentes, o fluxo de trabalho entre os serviços tende a ser complexo.Given the high number of independent moving parts, the workflow between services tends to get complex. Além disso, o rastreamento distribuído torna-se difícil.Also, distributed tracing becomes difficult.

O Orchestrator gerencia centralmente a resiliência do fluxo de trabalho e pode se tornar um ponto único de falha.The orchestrator centrally manages the resiliency of the workflow and it can become a single point of failure. Por outro lado, para coreografia, a função é distribuída entre todos os serviços e a resiliência se torna menos robusta.On the other hand, for choreography, the role is distributed between all services and resiliency becomes less robust.

Cada serviço não é responsável apenas pela resiliência de sua operação, mas também pelo fluxo de trabalho.Each service isn't only responsible for the resiliency of its operation but also the workflow. Essa responsabilidade pode ser cansativa para o serviço e difícil de implementar.This responsibility can be burdensome for the service and hard to implement. Cada serviço deve tentar falhas transitórias, não transitórias e de tempo limite, para que a solicitação seja encerrada normalmente, se necessário.Each service must retry transient, nontransient, and time-out failures, so that the request terminates gracefully, if needed. Além disso, o serviço deve ser muito cuidadoso ao comunicar o êxito ou a falha da operação para que outros serviços possam agir de acordo.Also, the service must be diligent about communicating the success or failure of the operation so that other services can act accordingly.

ExemploExample

Este exemplo mostra o padrão coreografia com o aplicativo de entrega drone.This example shows the choreography pattern with the Drone Delivery app. Quando um cliente solicita uma retirada, o aplicativo atribui um drone e notifica o cliente.When a client requests a pickup, the app assigns a drone and notifies the client.

Logotipo do GitHub um exemplo desse padrão está disponível no GitHub.GitHub logo An example of this pattern is available on GitHub.

Um fechamento de uma descrição de mapa gerada automaticamente

Uma transação de negócios de cliente único requer três operações comerciais distintas: criar ou atualizar um pacote, atribuir um drone para entregar o pacote e verificar o status de entrega.A single client business transaction requires three distinct business operations: creating or updating a package, assigning a drone to deliver the package, and checking the delivery status. Essas operações são executadas por três microserviços: pacote, Agendador drone e serviços de entrega.Those operations are performed by three microservices: Package, Drone Scheduler, and Delivery services. Em vez de um orquestrador central, os serviços usam o sistema de mensagens para colaborar e coordenar a solicitação entre si.Instead of a central orchestrator, the services use messaging to collaborate and coordinate the request among themselves.

DesignDesign

A transação comercial é processada em uma sequência por meio de vários saltos.The business transaction is processed in a sequence through multiple hops. Cada salto tem um barramento de mensagem e o respectivo serviço de negócios.Each hop has a message bus and the respective business service.

Quando um cliente envia uma solicitação de entrega por meio de um ponto de extremidade HTTP, o serviço de ingestão o recebe, gera um evento de operação e o envia para um barramento de mensagem.When a client sends a delivery request through an HTTP endpoint, the Ingestion service receives it, raises an operation event, and sends it to a message bus. O barramento invoca o serviço comercial assinado e envia o evento em uma solicitação POST.The bus invokes the subscribed business service and sends the event in a POST request. Ao receber o evento, o serviço de negócios pode concluir a operação com êxito, falha ou a solicitação pode atingir o tempo limite. Se for bem-sucedido, o serviço responderá ao barramento com o código de status OK, gerará um novo evento de operação e o enviará ao barramento de mensagem do próximo salto.On receiving the event, the business service can complete the operation with success, failure, or the request can time out. If successful, the service responds to the bus with the Ok status code, raises a new operation event, and sends it to the message bus of the next hop. No caso de uma falha ou de um tempo limite, o serviço relata falha enviando o código BadRequest para o barramento de mensagem que enviou a solicitação POST original.In case of a failure or time-out, the service reports failure by sending the BadRequest code to the message bus that sent the original POST request. O barramento de mensagem repete a operação com base em uma política de repetição.The message bus retries the operation based on a retry policy. Depois que o período expira, o barramento de mensagem sinaliza a operação com falha e o processamento adicional de toda a solicitação é interrompido.After that period expires, message bus flags the failed operation and further processing of the entire request stops.

Esse fluxo de trabalho continua até que toda a solicitação tenha sido processada.This workflow continues until the entire request has been processed.

O design usa vários barramentos de mensagens para processar toda a transação comercial.The design uses multiple message buses to process the entire business transaction. Microsoft Azure grade de eventos fornece o serviço de mensagens.Microsoft Azure Event Grid provides the messaging service. O aplicativo é implantado em um cluster AKs (serviço de kubernetes do Azure) com dois contêineres no mesmo Pod.The app is deployed in an Azure Kubernetes Service (AKS) cluster with two containers in the same pod. Um contêiner executa o embaixador que interage com a grade de eventos enquanto o outro executa um serviço de negócios.One container runs the ambassador that interacts with Event Grid while the other runs a business service. A abordagem com dois contêineres no mesmo Pod melhora o desempenho e a escalabilidade.The approach with two containers in the same pod improves performance and scalability. O embaixador e o serviço de negócios compartilham a mesma rede, permitindo baixa latência e alta taxa de transferência.The ambassador and the business service share the same network allowing for low latency and high throughput.

Para evitar operações de repetição em cascata que podem levar a vários esforços, somente a grade de eventos repete uma operação em vez do serviço de negócios.To avoid cascading retry operations that might lead to multiple efforts, only Event Grid retries an operation instead of the business service. Ele sinaliza uma solicitação com falha enviando uma mensagem para uma fila de mensagens mortas (DLQ).It flags a failed request by sending a messaging to a dead letter queue (DLQ).

Os serviços corporativos são idempotentes para garantir que as operações de repetição não resultem em recursos duplicados.The business services are idempotent to make sure retry operations don’t result in duplicate resources. Por exemplo, o serviço de pacote usa operações Upsert para adicionar dados ao armazenamento de dados.For example, the Package service uses upsert operations to add data to the data store.

O exemplo implementa uma solução personalizada para correlacionar chamadas em todos os serviços e saltos de grade de eventos.The example implements a custom solution to correlate calls across all services and Event Grid hops.

Aqui está um exemplo de código que mostra o padrão coreografia entre todos os serviços corporativos.Here’s a code example that shows the choreography pattern between all business services. Ele mostra o fluxo de trabalho das transações do aplicativo de entrega drone.It shows the workflow of the Drone Delivery app transactions. O código para tratamento de exceções e registro em log foi removido para fins de brevidade.Code for exception handling and logging have been removed for brevity.

[HttpPost]
[Route("/api/[controller]/operation")]
[ProducesResponseType(typeof(void), 200)]
[ProducesResponseType(typeof(void), 400)]
[ProducesResponseType(typeof(void), 500)]

public async Task<IActionResult> Post([FromBody] EventGridEvent[] events)
{

   if (events == null)
   {
       return BadRequest("No Event for Choreography");
   }

   foreach(var e in events)
   {

        List<EventGridEvent> listEvents = new List<EventGridEvent>();
        e.Topic = eventRepository.GetTopic();
        e.EventTime = DateTime.Now;
        switch (e.EventType)
        {
            case Operations.ChoreographyOperation.ScheduleDelivery:
            {
                var packageGen = await packageServiceCaller.UpsertPackageAsync(delivery.PackageInfo).ConfigureAwait(false);
                if (packageGen is null)
                {
                    //BadRequest allows the event to be reprocessed by Event Grid
                    return BadRequest("Package creation failed.");
                }

                //we set the event type to the next choreography step
                e.EventType = Operations.ChoreographyOperation.CreatePackage;
                listEvents.Add(e);
                await eventRepository.SendEventAsync(listEvents);
                return Ok("Created Package Completed");
            }
            case Operations.ChoreographyOperation.CreatePackage:
            {
                var droneId = await droneSchedulerServiceCaller.GetDroneIdAsync(delivery).ConfigureAwait(false);
                if (droneId is null)
                {
                    //BadRequest allows the event to be reprocessed by Event Grid
                    return BadRequest("could not get a drone id");
                }
                e.Subject = droneId;
                e.EventType = Operations.ChoreographyOperation.GetDrone;
                listEvents.Add(e);
                await eventRepository.SendEventAsync(listEvents);
                return Ok("Drone Completed");
            }
            case Operations.ChoreographyOperation.GetDrone:
            {
                var deliverySchedule = await deliveryServiceCaller.ScheduleDeliveryAsync(delivery, e.Subject);
                return Ok("Delivery Completed");
            }
            return BadRequest();
    }
}

Considere esses padrões em seu design para coreografia.Consider these patterns in your design for choreography.