Padrão de supervisor de agente do AgendadorScheduler Agent Supervisor pattern

Coordene um conjunto de ações distribuídas como uma única operação.Coordinate a set of distributed actions as a single operation. Se qualquer uma das ações falhar, tente tratar as falhas de forma transparente ou então desfaça o trabalho que foi executado para que toda a operação tenha êxito ou falhe como um todo.If any of the actions fail, try to handle the failures transparently, or else undo the work that was performed, so the entire operation succeeds or fails as a whole. Isso pode adicionar resiliência a um sistema distribuído, permitindo que se recupere e tente novamente as ações que falharem devido a exceções transitórias, falhas de longa duração e falhas do processo.This can add resiliency to a distributed system, by enabling it to recover and retry actions that fail due to transient exceptions, long-lasting faults, and process failures.

Contexto e problemaContext and problem

Um aplicativo executa tarefas que incluem uma série de etapas, algumas das quais podem invocar serviços remotos ou acessar recursos remotos.An application performs tasks that include a number of steps, some of which might invoke remote services or access remote resources. As etapas individuais podem ser independentes umas das outras, mas elas são organizadas pela lógica de aplicativo que implementa a tarefa.The individual steps might be independent of each other, but they are orchestrated by the application logic that implements the task.

Sempre que possível, o aplicativo deve garantir que a tarefa seja concluída e resolver as falhas que possam ocorrer ao acessar serviços ou recursos remotos.Whenever possible, the application should ensure that the task runs to completion and resolve any failures that might occur when accessing remote services or resources. As falhas podem ocorrer por várias razões.Failures can occur for many reasons. Por exemplo, a rede pode estar inativa, as comunicações podem ser interrompidas, um serviço remoto pode não estar respondendo ou pode estar em estado instável ou um recurso remoto pode estar temporariamente inacessível, talvez devido a restrições de recursos.For example, the network might be down, communications could be interrupted, a remote service might be unresponsive or in an unstable state, or a remote resource might be temporarily inaccessible, perhaps due to resource constraints. Em muitos casos as falhas serão transitórias e podem ser tratadas por meio de padrão de Repetição.In many cases the failures will be transient and can be handled by using the Retry pattern.

Se o aplicativo detectar uma falha mais permanente da qual não pode se recurar com facilidade, ele deve ser capaz de restaurar o sistema para um estado consistente e garantir a integridade de toda a operação.If the application detects a more permanent fault it can't easily recover from, it must be able to restore the system to a consistent state and ensure integrity of the entire operation.

SoluçãoSolution

O padrão de Supervisor de Agente do Agendador define os atores a seguir.The Scheduler Agent Supervisor pattern defines the following actors. Esses atores coordenam as etapas que devem ser executadas como parte da tarefa geral.These actors orchestrate the steps to be performed as part of the overall task.

  • O Agendador providencia as etapas que compõem a tarefa a ser executada e coordena a operação.The Scheduler arranges for the steps that make up the task to be executed and orchestrates their operation. Essas etapas podem ser combinadas em um pipeline ou fluxo de trabalho.These steps can be combined into a pipeline or workflow. O Agendador é responsável por garantir que as etapas nesse fluxo de trabalho sejam executadas na ordem correta.The Scheduler is responsible for ensuring that the steps in this workflow are performed in the right order. À medida que cada etapa é executada, o Agendador registra o estado do fluxo de trabalho, como "etapa ainda não iniciada", "etapa em execução" ou "etapa concluída".As each step is performed, the Scheduler records the state of the workflow, such as "step not yet started," "step running," or "step completed." As informações de estado também devem incluir um limite máximo de tempo permitido para a conclusão da etapa, chamado de tempo de conclusão.The state information should also include an upper limit of the time allowed for the step to finish, called the complete-by time. Se uma etapa requer acesso a um serviço ou recurso remoto, o Agendador invocar o agente apropriado, passando os detalhes do trabalho a ser executado.If a step requires access to a remote service or resource, the Scheduler invokes the appropriate Agent, passing it the details of the work to be performed. O Agendador normalmente se comunica com um Agente usando mensagens de solicitação/resposta assíncronas.The Scheduler typically communicates with an Agent using asynchronous request/response messaging. Isso pode ser implementado usando filas, embora outras tecnologias de mensagens distribuídas possam ser usadas em vez disso.This can be implemented using queues, although other distributed messaging technologies could be used instead.

    O Agendador executa uma função semelhante para o Gerenciador de Processo no padrão de Gerenciador de Processo.The Scheduler performs a similar function to the Process Manager in the Process Manager pattern. O fluxo de trabalho real normalmente é definido e implementado por um mecanismo de fluxo de trabalho que é controlado pelo Agendador.The actual workflow is typically defined and implemented by a workflow engine that's controlled by the Scheduler. Essa abordagem separa a lógica de negócios no fluxo de trabalho do Agendador.This approach decouples the business logic in the workflow from the Scheduler.

  • O Agente contém a lógica que encapsula uma chamada para um serviço remoto ou o acesso a um recurso remoto referenciado por uma etapa em uma tarefa.The Agent contains logic that encapsulates a call to a remote service, or access to a remote resource referenced by a step in a task. Cada Agente normalmente encapsula chamadas para um único serviço ou recurso, implementando a lógica de lidar com erros e tentar novamente (sujeito a uma restrição de tempo limite, descrita posteriormente).Each Agent typically wraps calls to a single service or resource, implementing the appropriate error handling and retry logic (subject to a timeout constraint, described later). Se as etapas no fluxo de trabalho sendo executadas pelo Agendador usam vários serviços e recursos entre etapas diferentes, cada etapa pode fazer referência a um Agente diferente (esse é um detalhe de implementação do padrão).If the steps in the workflow being run by the Scheduler use several services and resources across different steps, each step might reference a different Agent (this is an implementation detail of the pattern).

  • O Supervisor monitora o status das etapas da tarefa que está sendo executada pelo Agendador.The Supervisor monitors the status of the steps in the task being performed by the Scheduler. Ele é executado periodicamente (a frequência será específica do sistema) e examina o status das etapas mantidas pelo Agendador.It runs periodically (the frequency will be system-specific), and examines the status of steps maintained by the Scheduler. Se ele detectar algum que tenha expirado ou falhado, providenciará que o Agente apropriado recupere a etapa ou execute a ação corretiva apropriada (isso pode envolver a modificação do status de uma etapa).If it detects any that have timed out or failed, it arranges for the appropriate Agent to recover the step or execute the appropriate remedial action (this might involve modifying the status of a step). Observe que a recuperação ou as ações corretivas são implementadas pelo Agendador e os Agentes.Note that the recovery or remedial actions are implemented by the Scheduler and Agents. O Supervisor deve simplesmente solicitar que essas ações sejam executadas.The Supervisor should simply request that these actions be performed.

O Agendador, o Agente e o Supervisor são componentes lógicos e sua implementação física depende da tecnologia que está sendo usada.The Scheduler, Agent, and Supervisor are logical components and their physical implementation depends on the technology being used. Por exemplo, vários agentes lógicos podem ser implementados como parte de um único serviço web.For example, several logical agents might be implemented as part of a single web service.

O Agendador mantém informações sobre o andamento da tarefa e o estado de cada etapa em um repositório de dados durável, chamado de repositório de estado.The Scheduler maintains information about the progress of the task and the state of each step in a durable data store, called the state store. O Supervisor pode usar essas informações para ajudar a determinar se uma etapa falhou.The Supervisor can use this information to help determine whether a step has failed. A figura ilustra o relacionamento entre o Agendador, os Agentes, o Supervisor e o repositório de estado.The figure illustrates the relationship between the Scheduler, the Agents, the Supervisor, and the state store.

Figura 1 - Os atores no padrão de Supervisor de Agente do Agendador

Observação

Esse diagrama mostra uma versão simplificada do padrão.This diagram shows a simplified version of the pattern. Em uma implementação real, pode haver várias instâncias do Agendador em execução simultaneamente, cada uma um subconjunto da tarefas.In a real implementation, there might be many instances of the Scheduler running concurrently, each a subset of tasks. Da mesma forma, o sistema pode executar várias instâncias de cada Agente, ou até mesmo vários Supervisores.Similarly, the system could run multiple instances of each Agent, or even multiple Supervisors. Nesse caso, os Supervisores devem coordenar o trabalho entre si com cuidado para garantir que eles não compitam para recuperar as mesmas etapas e tarefas com falha.In this case, Supervisors must coordinate their work with each other carefully to ensure that they don’t compete to recover the same failed steps and tasks. O padrão de Eleição de Líder fornece uma solução possível para esse problema.The Leader Election pattern provides one possible solution to this problem.

Quando o aplicativo está pronto para executar uma tarefa, ele envia uma solicitação para o Agendador.When the application is ready to run a task, it submits a request to the Scheduler. O Agendador registra as informações de estado inicial sobre a tarefa e suas etapas (por exemplo, etapa ainda não iniciada) no repositório de estado e, em seguida, começa a executar as operações definidas pelo fluxo de trabalho.The Scheduler records initial state information about the task and its steps (for example, step not yet started) in the state store and then starts performing the operations defined by the workflow. Como o Agendador inicia cada etapa, ele atualiza as informações sobre o estado da etapa no repositório de estado (por exemplo, etapa em execução).As the Scheduler starts each step, it updates the information about the state of that step in the state store (for example, step running).

Se uma etapa faz referência a um serviço ou recurso remoto, o Agendador envia uma mensagem para o Agente apropriado.If a step references a remote service or resource, the Scheduler sends a message to the appropriate Agent. A mensagem contém as informações que o Agente deve passar para o serviço ou acessar o recurso, além do tempo de conclusão para a operação.The message contains the information that the Agent needs to pass to the service or access the resource, in addition to the complete-by time for the operation. Se o Agente concluir com êxito sua operação, ele enviará uma resposta para o Agendador.If the Agent completes its operation successfully, it returns a response to the Scheduler. O Agendador pode, em seguida, atualizar as informações de estado no repositório de estado (por exemplo, etapa concluída) e executar a próxima etapa.The Scheduler can then update the state information in the state store (for example, step completed) and perform the next step. Esse processo continua até que toda a tarefa seja concluída.This process continues until the entire task is complete.

Um Agente pode implementar qualquer lógica de repetição que seja necessária para realizar seu trabalho.An Agent can implement any retry logic that's necessary to perform its work. No entanto, se o Agente não concluir seu trabalho antes de o período de conclusão expirar, o Agendador presumirá que a operação falhou.However, if the Agent doesn't complete its work before the complete-by period expires, the Scheduler will assume that the operation has failed. Nesse caso, o Agente deve interromper seu trabalho e não tentar retorna nada para o Agendador (nem mesmo uma mensagem de erro) ou qualquer forma de recuperação.In this case, the Agent should stop its work and not try to return anything to the Scheduler (not even an error message), or try any form of recovery. A razão para essa restrição é que, após uma etapa expirar ou falhar, outra instância do Agente pode ser agendada para executar a etapa que falhou (esse processo é descrito posteriormente).The reason for this restriction is that, after a step has timed out or failed, another instance of the Agent might be scheduled to run the failing step (this process is described later).

Se o Agente falhar, o Agendador não receberá uma resposta.If the Agent fails, the Scheduler won't receive a response. O padrão não faz uma distinção entre uma etapa que atingiu o tempo limite e uma que realmente falhou.The pattern doesn't make a distinction between a step that has timed out and one that has genuinely failed.

Se uma etapa expirar ou falhar, o repositório de estado conterá um registro que indica que a etapa está em execução, mas o tempo de conclusão terá passado.If a step times out or fails, the state store will contain a record that indicates that the step is running, but the complete-by time will have passed. O Supervisor procura as etapas assim e tenta recuperá-las.The Supervisor looks for steps like this and tries to recover them. Uma estratégia possível é que o Supervisor atualize o valor completo para estender o tempo disponível para concluir a etapa e, em seguida, enviar uma mensagem ao Agendador identificando a etapa que se programou. O Agendador pode então tentar repetir este passo.One possible strategy is for the Supervisor to update the complete-by value to extend the time available to complete the step, and then send a message to the Scheduler identifying the step that has timed out. The Scheduler can then try to repeat this step. No entanto, esse design requer que as tarefas sejam idempotentes.However, this design requires the tasks to be idempotent.

O Supervisor pode precisar evitar que o mesmo passo seja repetido se ele falhar continuamente ou se apagar. Para isso, o Supervisor poderia manter uma contagem de repetição para cada etapa, juntamente com as informações do Estado, na loja do estado.The Supervisor might need to prevent the same step from being retried if it continually fails or times out. To do this, the Supervisor could maintain a retry count for each step, along with the state information, in the state store. Se essa contagem exceder um limite predefinido, o Supervisor pode adotar uma estratégia de espera por um longo período antes de notificar o Agendador de que ele deve tentar novamente a etapa, com a expectativa de que a falha seja resolvida durante esse período.If this count exceeds a predefined threshold the Supervisor can adopt a strategy of waiting for an extended period before notifying the Scheduler that it should retry the step, in the expectation that the fault will be resolved during this period. Como alternativa, o Supervisor pode enviar uma mensagem para o Agendador para solicitar que toda a tarefa seja desfeita implementando um padrão de Transação de Compensação.Alternatively, the Supervisor can send a message to the Scheduler to request the entire task be undone by implementing a Compensating Transaction pattern. Essa abordagem dependerá do Agendador e dos Agentes que fornecem as informações necessárias para implementar as operações de compensação para cada etapa concluída com êxito.This approach will depend on the Scheduler and Agents providing the information necessary to implement the compensating operations for each step that completed successfully.

Não é a finalidade do Supervisor monitorar o Agendador e os Agentes e reiniciá-los se eles falharem.It isn't the purpose of the Supervisor to monitor the Scheduler and Agents, and restart them if they fail. Esse aspecto do sistema deve ser tratado pela infraestrutura na qual esses componentes estão em execução.This aspect of the system should be handled by the infrastructure these components are running in. Da mesma forma, o Supervisor não deve ter conhecimento das operações de negócios que as tarefas executadas pelo Agendador estão executando (incluindo como compensar caso essas tarefas falhem).Similarly, the Supervisor shouldn't have knowledge of the actual business operations that the tasks being performed by the Scheduler are running (including how to compensate should these tasks fail). Essa é a finalidade da lógica de fluxo de trabalho implementada pelo Agendador.This is the purpose of the workflow logic implemented by the Scheduler. É de responsabilidade exclusiva do Supervisor determinar se uma etapa falhou e providenciar para que ela seja repetida ou para a tarefa inteira contendo a etapa que falhou seja desfeita.The sole responsibility of the Supervisor is to determine whether a step has failed and arrange either for it to be repeated or for the entire task containing the failed step to be undone.

Se o Agendador for reiniciado após uma falha ou o fluxo de trabalho sendo executado pelo Agendador terminar inesperadamente, o Agendador deverá ser capaz de determinar o status de qualquer tarefa em andamento que estava tratando quando falhou e estar preparado para continuar esta tarefa a partir desse ponto.If the Scheduler is restarted after a failure, or the workflow being performed by the Scheduler terminates unexpectedly, the Scheduler should be able to determine the status of any inflight task that it was handling when it failed, and be prepared to resume this task from that point. Os detalhes de implementação desse processo provavelmente serão específicos do sistema.The implementation details of this process are likely to be system-specific. Se a tarefa não puder ser recuperada, pode ser necessário desfazer o trabalho já foi executado pela tarefa.If the task can't be recovered, it might be necessary to undo the work already performed by the task. Isso também pode exigir a implementação de uma transação de compensação.This might also require implementing a compensating transaction.

A principal vantagem desse padrão é que o sistema é resiliente em caso de falhas inesperadas temporárias ou irrecuperáveis.The key advantage of this pattern is that the system is resilient in the event of unexpected temporary or unrecoverable failures. O sistema pode ser construído para ser auto-cura.The system can be constructed to be self-healing. Por exemplo, se um Agente ou o Agendador falhar, um novo pode ser iniciado e o Supervisor pode providenciar para que uma tarefa seja retomada.For example, if an Agent or the Scheduler fails, a new one can be started and the Supervisor can arrange for a task to be resumed. Se o Supervisor falhar, outra instância pode ser iniciada e pode assumir a partir onde a falha ocorreu.If the Supervisor fails, another instance can be started and can take over from where the failure occurred. Se o Supervisor for agendado para ser executado periodicamente, uma nova instância poderá ser iniciada automaticamente após um intervalo predefinido.If the Supervisor is scheduled to run periodically, a new instance can be automatically started after a predefined interval. O repositório de estado pode ser replicado para chegar a um nível ainda maior de resiliência.The state store can be replicated to reach an even greater degree of resiliency.

Problemas e consideraçõesIssues and considerations

Os seguintes pontos devem ser considerados ao decidir como implementar esse padrão:You should consider the following points when deciding how to implement this pattern:

  • Esse padrão pode ser difícil de implementar e requer um teste completo de cada modo de falha possíveis do sistema.This pattern can be difficult to implement and requires thorough testing of each possible failure mode of the system.

  • A lógica de repetição/recuperação implementada pelo Agendador é complexa e dependente de informações de estado mantidas no repositório de estado.The recovery/retry logic implemented by the Scheduler is complex and dependent on state information held in the state store. Também pode ser necessário registrar as informações necessárias para implementar uma transação de compensação em um repositório de dados durável.It might also be necessary to record the information required to implement a compensating transaction in a durable data store.

  • A frequência de execuções do Supervisor será importante.How often the Supervisor runs will be important. Ele deve ser executado com frequência suficiente para impedir que uma tarefa com falha aplicativ bloqueie um aplicativo por um longo período de tempo, mas não deve ser executado com uma frequência que crie uma sobrecarga.It should run often enough to prevent any failed steps from blocking an application for an extended period, but it shouldn't run so often that it becomes an overhead.

  • As etapas executadas por um Agente podem ser executadas mais de uma vez.The steps performed by an Agent could be run more than once. A lógica que implementa essas etapas deve ser idempotente.The logic that implements these steps should be idempotent.

Quando usar esse padrãoWhen to use this pattern

Use esse padrão quando um processo que é executado em um ambiente distribuído, como a nuvem, precisar ser resiliente a falhas de comunicação e/ou falha operacional.Use this pattern when a process that runs in a distributed environment, such as the cloud, must be resilient to communications failure and/or operational failure.

Esse padrão pode não ser adequado para tarefas que não invoquem serviços remotos ou acessem recursos remotos.This pattern might not be suitable for tasks that don't invoke remote services or access remote resources.

ExemploExample

Um aplicativo web que implementa um sistema de comércio eletrônico foi implantado no Microsoft Azure.A web application that implements an ecommerce system has been deployed on Microsoft Azure. Os usuários podem executar esse aplicativo para procurar os produtos disponíveis e fazer pedidos.Users can run this application to browse the available products and to place orders. A interface do usuário é executada como função web e os elementos de processamento de pedido do aplicativo são implementados como conjunto de funções de trabalho.The user interface runs as a web role, and the order processing elements of the application are implemented as a set of worker roles. Parte da lógica de processamento de pedidos envolve acessar um serviço remoto e esse aspecto do sistema pode estar sujeito a falhas transitórias ou de longa duração.Part of the order processing logic involves accessing a remote service, and this aspect of the system could be prone to transient or more long-lasting faults. Por esse motivo, os designers usaram o padrão de Supervisor de Agente do Agendador para implementar os elementos de processamento de pedidos do sistema.For this reason, the designers used the Scheduler Agent Supervisor pattern to implement the order processing elements of the system.

Quando um cliente faz um pedido, o aplicativo constrói uma mensagem que descreve o pedido e envia essa mensagem para uma fila.When a customer places an order, the application constructs a message that describes the order and posts this message to a queue. Um processo de envio separado, em execução em uma função de trabalho, recupera a mensagem, insere os detalhes do pedido no banco de dados de pedidos e cria um registro para o processo de pedido no repositório de estado.A separate submission process, running in a worker role, retrieves the message, inserts the order details into the orders database, and creates a record for the order process in the state store. Observe que as inserções no banco de dados de pedidos e o repositório de estado são executados como parte da mesma operação.Note that the inserts into the orders database and the state store are performed as part of the same operation. O processo de envio foi desenvolvido para garantir que ambas as inserções completem-se juntas.The submission process is designed to ensure that both inserts complete together.

As informações de estado que o processo de envio cria para o pedido incluem:The state information that the submission process creates for the order includes:

  • Orid.OrderID. A ID do pedido no banco de dados de pedidos.The ID of the order in the orders database.

  • LockedBy.LockedBy. A ID da instância da função de trabalho tratando o pedido.The instance ID of the worker role handling the order. Pode haver várias instâncias atuais da função de trabalho em execução no Agendador, mas cada pedido só deve ser tratado por uma única instância.There might be multiple current instances of the worker role running the Scheduler, but each order should only be handled by a single instance.

  • CompleteBy.CompleteBy. O prazo máximo de processamento do pedido.The time the order should be processed by.

  • ProcessState.ProcessState. O estado atual da tarefa tratando o pedido.The current state of the task handling the order. Os possíveis estados são:The possible states are:

    • Pendente.Pending. O pedido foi criado, mas o processamento ainda não foi iniciado.The order has been created but processing hasn't yet been started.
    • Processamento.Processing. O pedido está sendo processado no momento.The order is currently being processed.
    • Processado.Processed. O pedido foi processado com êxito.The order has been processed successfully.
    • Erro.Error. O processamento de pedido falhou.The order processing has failed.
  • FailureCount.FailureCount. O número de tentativas de processamento do pedido.The number of times that processing has been tried for the order.

Nessa informação de estado, o campo OrderID é copiado da ID do novo pedido.In this state information, the OrderID field is copied from the order ID of the new order. Os campos LockedBy e CompleteBy são definidos como null, o campo ProcessState é definido como Pending e o campo FailureCount é definido como 0.The LockedBy and CompleteBy fields are set to null, the ProcessState field is set to Pending, and the FailureCount field is set to 0.

Observação

Nesse exemplo, a lógica de tratamento de pedido é relativamente simples e tem apenas uma única etapa que invoca um serviço remoto.In this example, the order handling logic is relatively simple and only has a single step that invokes a remote service. Em um cenário multipasso mais complexo, o processo de submissão provavelmente envolveria várias — etapas, e assim vários registros seriam criados na loja do estado cada um descrevendo o estado de uma etapa individual.In a more complex multistep scenario, the submission process would likely involve several steps, and so several records would be created in the state store — each one describing the state of an individual step.

O Agendador também é executado como parte de uma função de trabalho e implementa a lógica de negócios que controla o pedido.The Scheduler also runs as part of a worker role and implements the business logic that handles the order. Uma instância do Agendador sonda novos pedidos examina o repositório de estado quanto a registros em que o campo LockedBy é nulo e o campo ProcessState está pendente.An instance of the Scheduler polling for new orders examines the state store for records where the LockedBy field is null and the ProcessState field is pending. Quando o Agendador encontra um novo pedido, ele preenche imediatamente o campo LockedBy com sua própria ID de instância, define o campo CompleteBy para um horário apropriado e define o campo ProcessState para processamento.When the Scheduler finds a new order, it immediately populates the LockedBy field with its own instance ID, sets the CompleteBy field to an appropriate time, and sets the ProcessState field to processing. O código é projetado para ser exclusivo e atômico para garantir que duas instâncias simultâneas do Agendador não possam tentar tratar o mesmo pedido simultaneamente.The code is designed to be exclusive and atomic to ensure that two concurrent instances of the Scheduler can't try to handle the same order simultaneously.

O Agendador, em seguida, executa o fluxo de trabalho de negócios para processar o pedido de forma assíncrona, passando o valor do campo OrderID do repositório de estado.The Scheduler then runs the business workflow to process the order asynchronously, passing it the value in the OrderID field from the state store. O fluxo de trabalho tratando o pedido recupera os detalhes do pedido do banco de dados de pedidos e executa seu trabalho.The workflow handling the order retrieves the details of the order from the orders database and performs its work. Quando uma etapa do fluxo de trabalho de processamento de pedido precisa invocar o serviço remoto, ele usa um Agente.When a step in the order processing workflow needs to invoke the remote service, it uses an Agent. A etapa de fluxo de trabalho se comunica com o Agente usando um par de filas de mensagens do Barramento de Serviço do Microsoft Azure agindo como canal de solicitação/resposta.The workflow step communicates with the Agent using a pair of Azure Service Bus message queues acting as a request/response channel. A figura mostra uma visão de alto nível da solução.The figure shows a high-level view of the solution.

Figura 2 - Usando o padrão Supervisor do Agente agendador para lidar com pedidos em uma solução Azure

A mensagem enviada para o Agente de uma etapa do fluxo de trabalho descreve o pedido e inclui o tempo de conclusão.The message sent to the Agent from a workflow step describes the order and includes the complete-by time. Se o Agente recebe uma resposta do serviço remoto antes de expirar o tempo de conclusão, ele envia uma mensagem de resposta na fila do Barramento de Serviço na qual o fluxo de trabalho está escutando.If the Agent receives a response from the remote service before the complete-by time expires, it posts a reply message on the Service Bus queue on which the workflow is listening. Quando a etapa do fluxo de trabalho recebe a mensagem de ProcessState resposta válida, ela completa seu processamento e o Agendador define o campo do estado de ordem a ser processado.When the workflow step receives the valid reply message, it completes its processing and the Scheduler sets the ProcessState field of the order state to processed. Nesse momento, o processamento do pedido estará concluído com sucesso.At this point, the order processing has completed successfully.

Se o tempo de conclusão expirar antes que o Agente receba uma resposta do serviço remoto, o Agente simplesmente interromperá o processamento e terminará de tratar o pedido.If the complete-by time expires before the Agent receives a response from the remote service, the Agent simply halts its processing and terminates handling the order. Da mesma forma, se o fluxo de trabalho tratando o pedido exceder o tempo de conclusão, ele também será encerrado.Similarly, if the workflow handling the order exceeds the complete-by time, it also terminates. Em ambos os casos, o estado do pedido no repositório de estado permanece configurado para processar, mas o tempo de conclusão indica que o tempo para processar o pedido foi excedido e o processo é considerado com falha.In both cases, the state of the order in the state store remains set to processing, but the complete-by time indicates that the time for processing the order has passed and the process is deemed to have failed. Observe que se o Agente que está acessando o serviço remoto ou se o fluxo de trabalho que está tratando o pedido (ou ambos) for encerrado inesperadamente, as informações no repositório de estado novamente permanecerão configuradas para processar e, por fim, terão um valor de conclusão expirado.Note that if the Agent that's accessing the remote service, or the workflow that's handling the order (or both) terminate unexpectedly, the information in the state store will again remain set to processing and eventually will have an expired complete-by value.

Se o Agente detectar uma falha irrecuperável e não transitória enquanto está tentando entrar em contato com o serviço remoto, ele poderá enviar uma resposta de erro de volta para o fluxo de trabalho.If the Agent detects an unrecoverable, nontransient fault while it's trying to contact the remote service, it can send an error response back to the workflow. O Agendador pode definir o status do pedido como erro e acionar um evento que alerta o operador.The Scheduler can set the status of the order to error and raise an event that alerts an operator. O operador pode, então, tentar resolver manualmente o motivo da falha e reenviar a etapa de processamento com falha.The operator can then try to resolve the reason for the failure manually and resubmit the failed processing step.

O Supervisor periodicamente examina o repositório de estado procurando pedidos com valor de conclusão expirado.The Supervisor periodically examines the state store looking for orders with an expired complete-by value. Se o Supervisor localizar um registro, o campo FailureCount será incrementado.If the Supervisor finds a record, it increments the FailureCount field. Se o valor de contagem de falha estiver abaixo de um valor de limite especificado, o Supervisor redefinirá o campo LockedBy para nulo, atualizará o campo CompleteBy com um novo tempo de expiração e definirá o campo ProcessState como pendente.If the failure count value is below a specified threshold value, the Supervisor resets the LockedBy field to null, updates the CompleteBy field with a new expiration time, and sets the ProcessState field to pending. Uma instância do Agendador pode pegar esse pedido e executar o processamento como antes.An instance of the Scheduler can pick up this order and perform its processing as before. Se o valor de contagem de falhas exceder um limite especificado, o motivo da falha será considerado não transitório.If the failure count value exceeds a specified threshold, the reason for the failure is assumed to be nontransient. O Supervisor define o status do pedido como erro e aciona um evento que alerta o operador.The Supervisor sets the status of the order to error and raises an event that alerts an operator.

Neste exemplo, o Supervisor é implementado em uma função de trabalho separada.In this example, the Supervisor is implemented in a separate worker role. Você pode usar uma variedade de estratégias para fazer com que a tarefa do Supervisor seja executado, inclusive usando o serviço do Agendador do Azure (não deve ser confundido com o componente do Agendador neste padrão).You can use a variety of strategies to arrange for the Supervisor task to be run, including using the Azure Scheduler service (not to be confused with the Scheduler component in this pattern). Para obter mais informações sobre o serviço de Agendador do Azure, acesse a página do Agendador.For more information about the Azure Scheduler service, visit the Scheduler page.

Embora não mostrado neste exemplo, o Agendador talvez precise manter o aplicativo que enviou o pedido informado sobre o andamento e o status do pedido.Although it isn't shown in this example, the Scheduler might need to keep the application that submitted the order informed about the progress and status of the order. O aplicativo e o Agendador são isolados um do outro para eliminar todas as dependências entre eles.The application and the Scheduler are isolated from each other to eliminate any dependencies between them. O aplicativo não sabe qual instância do Agendador está tratando o pedido e o Agendador não fica ciente de qual instância específica do aplicativo publicou o pedido.The application has no knowledge of which instance of the Scheduler is handling the order, and the Scheduler is unaware of which specific application instance posted the order.

Para permitir que o status do pedido seja relatado, o aplicativo pode usar sua própria fila de resposta privada.To allow the order status to be reported, the application could use its own private response queue. Os detalhes dessa fila de resposta seriam incluídos como parte da solicitação enviada para o processo de envio, que incluiria essas informações no repositório de estado.The details of this response queue would be included as part of the request sent to the submission process, which would include this information in the state store. O Agendador, então, publicaria mensagens nessa fila indicando o status do pedido (solicitação recebida, pedido concluído, pedido com falha e assim por diante).The Scheduler would then post messages to this queue indicating the status of the order (request received, order completed, order failed, and so on). Ela deve incluir a ID do pedido nessas mensagens para que possam ser correlacionadas com a solicitação original pelo aplicativo.It should include the order ID in these messages so they can be correlated with the original request by the application.

Os padrões e diretrizes a seguir também podem ser relevantes ao implementar esse padrão:The following patterns and guidance might also be relevant when implementing this pattern:

  • Padrão de repetição.Retry pattern. Um Agente pode usar esse padrão para repetir de modo transparente uma operação que acessa um serviço ou recurso remoto que tenha falhado anteriormente.An Agent can use this pattern to transparently retry an operation that accesses a remote service or resource that has previously failed. Use quando a expectativa é de que a causa da falha é transitória e pode ser corrigida.Use when the expectation is that the cause of the failure is transient and can be corrected.
  • Padrão do disjuntor.Circuit Breaker pattern. Um Agente pode usar esse padrão para tratar as falhas que consumem uma quantidade variável de tempo para serem corrigidas ao se conectar a um serviço ou recurso remoto.An Agent can use this pattern to handle faults that take a variable amount of time to correct when connecting to a remote service or resource.
  • Compensando o padrão de transação.Compensating Transaction pattern. Se o fluxo de trabalho que está sendo executado por um Agendador não puder ser concluído com êxito, poderá ser necessário desfazer qualquer trabalho executado anteriormente.If the workflow being performed by a Scheduler can't be completed successfully, it might be necessary to undo any work it's previously performed. O padrão de Transação de Compensação descreve como isso pode ser feito para operações que seguem o modelo de consistência futuro.The Compensating Transaction pattern describes how this can be achieved for operations that follow the eventual consistency model. Esses tipos de operações geralmente são implementados por um Agendador que executa fluxos de trabalho e processos de negócios complexos.These types of operations are commonly implemented by a Scheduler that performs complex business processes and workflows.
  • Prévia de mensagens assíncronas.Asynchronous Messaging Primer. Os componentes no padrão de Supervisor de Agente do Agendador normalmente são executados separados uns dos outros e se comunicam de forma assíncrona.The components in the Scheduler Agent Supervisor pattern typically run decoupled from each other and communicate asynchronously. Descreve algumas das abordagens que podem ser usadas para implementar a comunicação assíncrona com base em filas de mensagens.Describes some of the approaches that can be used to implement asynchronous communication based on message queues.
  • Padrão de eleição de líder.Leader Election pattern. Talvez seja necessário coordenar as ações de várias instâncias de um Supervisor para impedir que tentem recuperar o mesmo processo com falha.It might be necessary to coordinate the actions of multiple instances of a Supervisor to prevent them from attempting to recover the same failed process. O padrão de eleição de líder descreve como fazer isso.The Leader Election pattern describes how to do this.
  • Arquitetura de nuvem: o padrão de Agendador-Agente-Supervisor no blog de Clemens VastersCloud Architecture: The Scheduler-Agent-Supervisor Pattern on Clemens Vasters' blog
  • Padrão de gerenciador de processoProcess Manager pattern
  • Referência 6: uma saga em Sagas.Reference 6: A Saga on Sagas. Um exemplo que mostra como o padrão CQRS usa um gerenciador de processo (parte do guia Recurso CQRS).An example showing how the CQRS pattern uses a process manager (part of the CQRS Journey guidance).
  • Agendador do Microsoft AzureMicrosoft Azure Scheduler