Desenvolvendo decisores no Amazon SWF - Amazon Simple Workflow Service

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Desenvolvendo decisores no Amazon SWF

Um agente de decisão é uma implementação da lógica de coordenação do seu tipo de fluxo de trabalho que é processada durante a execução do seu fluxo de trabalho. É possível executar vários agentes de decisão para um único tipo de fluxo de trabalho.

Como o estado de execução de um fluxo de trabalho é armazenado em seu histórico de fluxo de trabalho, os decisores podem ficar sem estado. O Amazon SWF mantém o histórico de execução do fluxo de trabalho e o fornece a um decisor em cada tarefa de decisão. Isso permite que você adicione e remova agentes de decisão dinamicamente conforme necessário, o que torna o processamento dos seus fluxos de trabalho altamente escalável. À medida que a carga no seu sistema crescer, basta adicionar mais agentes de decisão para lidar com a capacidade aumentada. Porém, observe que pode haver apenas uma tarefa de decisão aberta a qualquer momento para uma determinada execução de fluxo de trabalho.

Toda vez que ocorre uma mudança de estado para a execução de um fluxo de trabalho, o Amazon SWF agenda uma tarefa de decisão. Sempre que um agente de decisão recebe uma tarefa de decisão, ele faz o seguinte:

  • Interpreta o histórico de execução de fluxo de trabalho fornecido com a tarefa de decisão

  • Aplica a lógica de coordenação com base no histórico de execução de fluxo de trabalho e toma decisões sobre o que fazer em seguida. Cada decisão é representada por uma estrutura de decisão

  • Conclui a tarefa de decisão e fornece uma lista de decisões ao Amazon SWF.

Esta seção descreve como desenvolver um agente de decisão, o que envolve:

  • Programar o agente de decisão para sondar tarefas de decisão

  • Programar o agente de decisão para interpretar o histórico de execução de fluxo de trabalho e tomar decisões

  • Programar o agente de decisão para responder a uma tarefa de decisão.

Os exemplos desta seção mostram como é possível programar um agente de decisão para o exemplo de fluxo de trabalho de comércio eletrônico.

Você pode implementar o decodificador em qualquer linguagem que desejar e executá-lo em qualquer lugar, desde que ele possa se comunicar com o Amazon SWF por meio de sua API de serviço.

Definir a lógica de coordenação

A primeira coisa a fazer ao desenvolver um agente de decisão é definir a lógica de coordenação. No exemplo de comércio eletrônico, a lógica de coordenação que agenda cada atividade após a conclusão da atividade anterior pode parecer semelhante à seguinte:

IF lastEvent = "StartWorkflowInstance" addToDecisions ScheduleVerifyOrderActivity ELSIF lastEvent = "CompleteVerifyOrderActivity" addToDecisions ScheduleChargeCreditCardActivity ELSIF lastEvent = "CompleteChargeCreditCardActivity" addToDecisions ScheduleCompleteShipOrderActivity ELSIF lastEvent = "CompleteShipOrderActivity" addToDecisions ScheduleRecordOrderCompletion ELSIF lastEvent = "CompleteRecordOrderCompletion" addToDecisions CloseWorkflow ENDIF

O agente de decisão aplica a lógica de coordenação ao histórico de execução de fluxo de trabalho e cria uma lista de decisões ao concluir a tarefa de decisão usando a ação RespondDecisionTaskCompleted.

Sondar tarefas de decisão

Cada agente de decisão faz uma sondagem em busca de tarefas de decisão. As tarefas de decisão contêm as informações que o agente de decisão utiliza para gerar decisões, como agendar tarefas de atividade. Para sondar tarefas de decisão, o agente de decisão usa a ação PollForDecisionTask.

Neste exemplo, o agente de decisão faz uma sondagem em busca de uma tarefa de decisão, especificando a lista de tarefas customerOrderWorkflow-0.1.

https://swf.us-east-1.amazonaws.com PollForDecisionTask { "domain": "867530901", "taskList": {"name": "customerOrderWorkflow-v0.1"}, "identity": "Decider01", "maximumPageSize": 50, "reverseOrder": true }

Se uma tarefa de decisão estiver disponível na lista de tarefas especificada, o Amazon SWF a retornará imediatamente. Se nenhuma tarefa de decisão estiver disponível, o Amazon SWF manterá a conexão aberta por até 60 segundos e retornará uma tarefa assim que ela estiver disponível. Se nenhuma tarefa estiver disponível, o Amazon SWF retornará uma resposta vazia. Uma resposta vazia é uma estrutura Task na qual o valor de taskToken é uma string vazia. Certifique-se de programar seu agente de decisão para sondar outra tarefa se ele receber uma resposta vazia.

Se uma tarefa de decisão estiver disponível, o Amazon SWF retornará uma resposta que contém a tarefa de decisão, bem como uma exibição paginada do histórico de execução do fluxo de trabalho.

Neste exemplo, o tipo de evento mais recente indica que a execução de fluxo de trabalho foi iniciada e que o elemento de entrada contém as informações necessárias para realizar a primeira tarefa.

{ "events": [ { "decisionTaskStartedEventAttributes": { "identity": "Decider01", "scheduledEventId": 2 }, "eventId": 3, "eventTimestamp": 1326593394.566, "eventType": "DecisionTaskStarted" }, { "decisionTaskScheduledEventAttributes": { "startToCloseTimeout": "600", "taskList": { "name": "specialTaskList" } }, "eventId": 2, "eventTimestamp": 1326592619.474, "eventType": "DecisionTaskScheduled" }, { "eventId": 1, "eventTimestamp": 1326592619.474, "eventType": "WorkflowExecutionStarted", "workflowExecutionStartedEventAttributes": { "childPolicy" : "TERMINATE", "executionStartToCloseTimeout" : "3600", "input" : "data-used-decider-for-first-task", "parentInitiatedEventId": 0, "tagList" : ["music purchase", "digital", "ricoh-the-dog"], "taskList": { "name": "specialTaskList" }, "taskStartToCloseTimeout": "600", "workflowType": { "name": "customerOrderWorkflow", "version": "1.0" } } } ], ... }

Depois de receber o histórico de execução de fluxo de trabalho, o agente de decisão interpreta esse histórico e toma decisões com base em sua lógica de coordenação.

Como o número de eventos do histórico de fluxo de trabalho para uma única execução de fluxo de trabalho pode ser grande, o resultado retornado pode ser dividido em várias páginas. Para recuperar as páginas subsequentes, faça chamadas adicionais para PollForDecisionTask usando o NextPageToken retornado pela chamada inicial. Observe que você não chama GetWorkflowExecutionHistory com esse nextPageToken. Em vez disso, chame PollForDecisionTask novamente.

Aplicar a lógica de coordenação

Depois que o agente de decisão receber uma tarefa de decisão, programe-a para interpretar o histórico de execução de fluxo de trabalho e determinar o que aconteceu até agora. Com base nisso, ele deverá gerar uma lista de decisões.

No exemplo de comércio eletrônico, estamos preocupados apenas com o último evento no histórico de fluxo de trabalho e, portanto, definimos a seguinte lógica.

IF lastEvent = "StartWorkflowInstance" addToDecisions ScheduleVerifyOrderActivity ELSIF lastEvent = "CompleteVerifyOrderActivity" addToDecisions ScheduleChargeCreditCardActivity ELSIF lastEvent = "CompleteChargeCreditCardActivity" addToDecisions ScheduleCompleteShipOrderActivity ELSIF lastEvent = "CompleteShipOrderActivity" addToDecisions ScheduleRecordOrderCompletion ELSIF lastEvent = "CompleteRecordOrderCompletion" addToDecisions CloseWorkflow ENDIF

Se lastEvent for CompleteVerifyOrderActivity, você adicionará a atividade ScheduleChargeCreditCardActivity à lista de decisões.

Depois que o decisor determina a(s) decisão(ões) a ser(em) tomada(s), ele pode responder ao Amazon SWF com decisões apropriadas.

Responder com decisões

Depois de interpretar o histórico do fluxo de trabalho e gerar uma lista de decisões, o decider está pronto para responder ao Amazon SWF com essas decisões.

Programe seu agente de decisão para extrair os dados necessários do histórico de execução de fluxo de trabalho e, em seguida, criar decisões que especificam as próximas ações apropriadas para o fluxo de trabalho. O decodificador transmite essa decisão de volta ao Amazon SWF usando a ação RespondDecisionTaskCompleted. Consulte a referência da API do Amazon Simple Workflow Service para obter uma lista dos tipos de decisão disponíveis.

No exemplo de comércio eletrônico, quando o agente de decisão responde com o conjunto de decisões que ele gerou, ele também inclui a entrada de cartão de crédito do histórico de execução de fluxo de trabalho. Dessa forma, o operador de atividade tem as informações necessárias para realizar a tarefa de atividade.

Quando todas as atividades na execução de fluxo de trabalho estiverem concluídas, o agente de decisão encerrará a execução de fluxo de trabalho.

https://swf.us-east-1.amazonaws.com RespondDecisionTaskCompleted { "taskToken" : "12342e17-80f6-FAKE-TASK-TOKEN32f0223", "decisions" : [ { "decisionType" :"ScheduleActivityTask", "scheduleActivityTaskDecisionAttributes" : { "control" :"OPTIONAL_DATA_FOR_DECIDER", "activityType" : { "name" :"ScheduleChargeCreditCardActivity", "version" :"1.1" }, "activityId" :"3e2e6e55-e7c4-beef-feed-aa815722b7be", "scheduleToCloseTimeout" :"360", "taskList" : { "name" :"CC_TASKS" }, "scheduleToStartTimeout" :"60", "startToCloseTimeout" :"300", "heartbeatTimeout" :"60", "input" : "4321-0001-0002-1234: 0212 : 234" } } ] }

Fechar uma execução de fluxo de trabalho

Quando o agente de decisão determinar que o processo de negócios está concluído, ou seja, que não há mais atividades para realizar, ele gerará uma decisão de encerrar a execução de fluxo de trabalho.

Para encerrar uma execução de fluxo de trabalho, programe seu agente de decisão para interpretar os eventos no histórico de fluxo de trabalho de modo a determinar o que aconteceu na execução até agora e verificar se ela deve ser encerrada.

Se o fluxo de trabalho tiver sido concluído com sucesso, encerre a execução de fluxo de trabalho chamando RespondDecisionTaskCompleted com a decisão CompleteWorkflowExecution. Como alternativa, você pode marcar uma execução incorreta como falha usando a decisão FailWorkflowExecution.

No exemplo de comércio eletrônico, o agente de decisão analisa o histórico e, com base na lógica de coordenação, adiciona uma decisão para encerrar a execução de fluxo de trabalho à sua lista de decisões e inicia uma ação RespondDecisionTaskCompleted com uma decisão de encerramento de fluxo de trabalho.

nota

Existem alguns casos em que o encerramento de uma execução de fluxo de trabalho falha. Por exemplo, se um sinal for recebido enquanto o agente de decisão estiver encerrando a execução de fluxo de trabalho, a decisão de encerramento falhará. Para lidar com essa possibilidade, certifique-se de que o agente de decisão continue a sondar tarefas de decisão. Além disso, garanta que o decisor que recebe a próxima tarefa de decisão responda ao evento - nesse caso, um sinal - que impediu o encerramento da execução.

Você também pode oferecer suporte ao cancelamento de execuções de fluxo de trabalho. Isso pode ser especialmente útil para fluxos de trabalho de longa duração. Para oferecer suporte ao cancelamento, o agente de decisão deve lidar com o evento WorkflowExecutionCancelRequested na histórico. Esse evento indica que o cancelamento da execução foi solicitado. O agente de decisão deve realizar as ações de limpeza apropriadas, como cancelar tarefas de atividades contínuas e encerrar o fluxo de trabalho, chamando a ação RespondDecisionTaskCompleted com a decisão CancelWorkflowExecution.

O exemplo a seguir chama RespondDecisionTaskCompleted para especificar que a execução atual do fluxo de trabalho está cancelada.

https://swf.us-east-1.amazonaws.com RespondDecisionTaskCompleted { "taskToken" : "12342e17-80f6-FAKE-TASK-TOKEN32f0223", "decisions" : [ { "decisionType":"CancelWorkflowExecution", "CancelWorkflowExecutionAttributes":{ "Details": "Customer canceled order" } } ] }

O Amazon SWF verifica para garantir que a decisão de fechar ou cancelar a execução do fluxo de trabalho seja a última decisão enviada pelo agente de decisão. Ou seja, não é válido ter um conjunto de decisões em que há decisões após aquela que encerra o fluxo de trabalho.

Iniciar agentes de decisão

Depois de concluir o desenvolvimento de agentes de decisão, você está pronto para iniciar um ou mais deles.

Para iniciar agentes de decisão, empacote sua lógica de coordenação em um executável que você possa usar na sua plataforma de agentes de decisão. Por exemplo, você pode empacotar o código do agente de decisão como um executável Java que pode ser executado em computadores Linux e Windows.

Uma vez iniciado, seus agente de decisão devem começar a sondar o Amazon SWF em busca de tarefas. Até que você inicie as execuções do fluxo de trabalho e o Amazon SWF programe as tarefas de decisão, essas enquetes terão um tempo limite e receberão respostas vazias. Uma resposta vazia é uma estrutura Task na qual o valor de taskToken é uma string vazia. Seus agentes de decisão devem simplesmente continuar a sondagem.

O Amazon SWF garante que apenas uma tarefa de decisão possa estar ativa para a execução de um fluxo de trabalho a qualquer momento. Isso evita problemas, como decisões conflitantes. Além disso, o Amazon SWF garante que uma única tarefa de decisão seja atribuída a um único agente de decisão, independentemente do número de decisores que estejam em execução.

Se ocorrer algo que gere uma tarefa de decisão enquanto um agente de decisão estiver processando outra tarefa de decisão, o Amazon SWF enfileira a nova tarefa até que a tarefa atual seja concluída. Após a conclusão da tarefa atual, o Amazon SWF disponibiliza a nova tarefa de decisão. Além disso, as tarefas de decisão são agrupadas, no sentido de que, se várias atividades forem concluídas enquanto um agente de decisão estiver processando uma tarefa de decisão, o Amazon SWF criará apenas uma única nova tarefa de decisão para contabilizar as várias conclusões de tarefas. No entanto, cada conclusão de tarefa receberá um evento individual no histórico de execução de fluxo de trabalho.

Como as pesquisas são solicitações de saída, os agentes de decisão podem ser executados em qualquer rede que tenha acesso ao endpoint do Amazon SWF.

Para que as execuções de fluxo de trabalho avancem, um ou mais agentes de decisão devem estar em execução. Inicie quantos decisores quiser. O Amazon SWF suporta a votação de vários decisores na mesma lista de tarefas.