Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.
Développement de décideurs dans Amazon SWF
Les décideurs sont des implémentations de la logique de coordination qui est appliquée lors de l'exécution de votre flux de travail. Vous pouvez exécuter plusieurs décideurs pour un seul type de flux de travail.
Comme l'état d'exécution d'une exécution de flux de travail est stocké dans son historique de flux de travail, les décideurs peuvent être sans état. Amazon SWF gère l'historique des exécutions de flux de travail et le fournit à un décideur avec chaque tâche de décision. Cela vous permet, le cas échéant, d'ajouter et de supprimer les décideurs, ce qui optimise l'évolutivité du traitement des flux de travail. Lorsque la charge système augmente, il vous suffit d'ajouter des décideurs pour gérer l'accroissement de la capacité. Notez, toutefois, qu'une seule tâche de décision à la fois peut être ouverte pour une exécution de workflow donnée.
Chaque fois qu'un changement d'état se produit pour une exécution de flux de travail, Amazon SWF planifie une tâche de décision. Chaque fois qu'un décideur reçoit une tâche de décision, il effectue les opérations suivantes :
-
Il interprète l'historique d'exécution du flux de travail fourni avec la tâche de la décision.
-
Il applique la logique de coordination en fonction de l'historique d'exécution du flux de travail et émet des décisions sur ce qu'il faut faire ensuite. Chacune d'elles est représentée par une structure de décision.
-
Finalise la tâche de décision et fournit la liste des décisions à Amazon SWF.
Cette section décrit comment développer un décideur, ce qui implique les actions suivantes :
-
Programmation du décideur pour qu'il recherche les tâches de décision
-
Programmation du décideur pour qu'il interprète l'historique d'exécution du flux de travail et pour qu'il prenne des décisions
-
Programmation du décideur pour qu'il réponde à une tâche de décision
Les exemples de cette section illustrent comment programmer un décideur pour le flux de travail d'un commerce en ligne.
Vous pouvez mettre en œuvre le décideur dans le langage de votre choix et l'exécuter n'importe où, tant qu'il parvient à communiquer avec Amazon SWF via son API de service.
Rubriques
Définition de la logique de coordination
La première étape à suivre lors du développement d'un décideur consiste à définir la logique de coordination. Pour un commerce en ligne, la logique de coordination qui planifie chaque activité une fois que l'activité précédente se termine peut ressembler à cela :
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
Le décideur applique la logique de coordination de l'historique d'exécution du flux de travail et crée une liste des décisions lorsqu'il finalise la tâche de décision à l'aide de l'action RespondDecisionTaskCompleted
.
Recherche des tâches de décision
Chaque décideur recherche les tâches de décision. Ces dernières contiennent les informations que le décideur utilise pour générer des décisions telles que la planification des tâches d'activité. Pour rechercher les tâches de décision, le décideur utilise l'action PollForDecisionTask
.
Dans cet exemple, le décideur recherche une tâche de décision, en spécifiant la liste de tâches customerOrderWorkflow-0.1
.
https://swf.us-east-1.amazonaws.com PollForDecisionTask { "domain": "867530901", "taskList": {"name": "customerOrderWorkflow-v0.1"}, "identity": "Decider01", "maximumPageSize": 50, "reverseOrder": true }
Si une tâche de décision est disponible dans la liste des tâches spécifiée, Amazon SWF la retourne immédiatement. Si aucune tâche de décision n'est disponible après ce délai, Amazon SWF conserve la connexion ouverte pendant une durée maximale de 60 secondes et renvoie une tâche dès qu'elle devient disponible. Si aucune tâche n'est disponible après ce délai, Amazon SWF renvoie une réponse vide. Une réponse vide est une structure Task
dans laquelle la valeur taskToken
est une chaîne vide. Prenez soin de programmer le décideur de sorte qu'il recherche une autre tâche s'il reçoit une réponse vide.
Si une tâche de décision est disponible, Amazon SWF renvoie une réponse qui contient la tâche de décision, ainsi qu'une vue paginée de l'historique d'exécution du flux de travail.
Dans cet exemple, le type de l'événement le plus récent indique que l'exécution du flux de travail a commencé et que l'élément d'entrée contient les informations nécessaires pour effectuer la première tâche.
{ "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" } } } ], ... }
Après la réception de l'historique d'exécution du flux de travail, le décideur interprète l'historique et prend des décisions en fonction de sa logique de coordination.
Comme le nombre d'événements de l'historique d'une seule exécution de flux de travail peut être élevé, le résultat renvoyé est parfois réparti sur plusieurs pages. Pour récupérer les pages suivantes, effectuez des appels supplémentaires à PollForDecisionTask
via le jeton nextPageToken renvoyé par l'appel initial. Notez que vous ne pouvez pas appeler GetWorkflowExecutionHistory
avec nextPageToken. Au lieu de cela, appelez PollForDecisionTask
à nouveau.
Application de la logique de coordination
Une fois que le décideur reçoit une tâche de décision, programmez-le pour qu'il interprète l'historique d'exécution du flux de travail afin de déterminer les événements qui ont eu lieu jusque-là. Il devrait se baser sur ces informations pour générer une liste des décisions.
Dans l'exemple de commerce en ligne que nous avons choisi, seul le dernier événement de l'historique du flux de travail nous intéresse. Nous définissons donc la logique suivante.
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
Si le dernier événement correspond à CompleteVerifyOrderActivity
, vous devez ajouter l'activité ScheduleChargeCreditCardActivity
à la liste des décisions.
Une fois que le décideur a déterminé les décisions à prendre, il peut renvoyer les décisions appropriées à Amazon SWF.
Renvoi des décisions
Après avoir interprété l'historique de flux de travail et généré une liste de décisions, le décideur est prêt à renvoyer ces décisions à Amazon SWF.
Programmez le décideur pour qu'il extraie les données dont il a besoin dans l'historique d'exécution du flux de travail, puis créez des décisions qui spécifient les actions appropriées suivantes pour ce dernier. Le décideur renvoie ces décisions à Amazon SWF à l'aide duRespondDecisionTaskCompleted
action. ConsultezRéférence de l'API Amazon Simple Workflow Servicepour obtenir la liste des produits disponiblestypes de décision.
Dans l'exemple de commerce en ligne, lorsque le décideur renvoie l'ensemble des décisions qu'il a générées, il inclut également l'entrée de la carte de crédit provenant de l'historique d'exécution du flux de travail. L'outil de traitement d'activité dispose ensuite des informations dont il a besoin pour effectuer la tâche d'activité.
Lorsque toutes les activités de l'exécution de flux de travail sont terminées, le décideur ferme celle-ci.
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" } } ] }
Fermeture d'une exécution de flux de travail
Lorsque le décideur détermine que le processus est terminé (autrement dit, qu'il n'y a plus d'activités à effectuer), le décideur génère une décision pour fermer l'exécution de flux de travail.
Afin de fermer une exécution du flux de travail, programmez le décideur pour qu'il interprète les événements de l'historique de flux de travail afin de déterminer ce qui s'est passé lors de l'exécution du flux de travail et pour voir si cette dernière doit être fermée.
Si le flux de travail est terminé sans erreur, fermez l'exécution du flux de travail en appelant RespondDecisionTaskCompleted
avec la décision CompleteWorkflowExecution
. Si l'exécution est erronée, vous pouvez l'arrêter à l'aide de la décision FailWorkflowExecution
.
Dans cet exemple de commerce en ligne, le décideur examine l'historique et se base sur la logique de coordination pour ajouter une décision de fermeture de l'exécution de flux de travail à la liste des décisions, puis initie une action RespondDecisionTaskCompleted
avec une décision de fermeture du flux de travail.
Note
Dans certains cas, fermeture d'une exécution de flux de travail peut échouer. Par exemple, si un signal est reçu pendant que le décideur ferme l'exécution du flux de travail, la décision de fermeture échoue. Pour gérer cette possibilité, vérifiez que le décideur continue de rechercher les tâches de décision. En outre, assurez-vous que le décideur qui reçoit la tâche de décision suivante réponde à l'événement, dans ce cas, un signal—qui a empêché la fermeture de l'exécution.
Si vous le souhaitez, vous pouvez également annuler les exécutions de flux de travail. Cette approche peut s'avérer particulièrement utile pour les flux de travail de longue durée. Pour permettre l'annulation, le décideur doit gérer l'événement WorkflowExecutionCancelRequested
dans l'historique. Cet événement indique que l'annulation de l'exécution a été demandée. Le décideur doit effectuer les opérations de nettoyage appropriées, telles que l'annulation des tâches d'activité en cours et la fermeture du flux de travail en appelant l'action RespondDecisionTaskCompleted
avec la décision CancelWorkflowExecution
.
L'exemple suivant appelle RespondDecisionTaskCompleted
pour spécifier que l'exécution de flux de travail en cours est annulée.
https://swf.us-east-1.amazonaws.com RespondDecisionTaskCompleted { "taskToken" : "12342e17-80f6-FAKE-TASK-TOKEN32f0223", "decisions" : [ { "decisionType":"CancelWorkflowExecution", "CancelWorkflowExecutionAttributes":{ "Details": "Customer canceled order" } } ] }
Amazon SWF s'assure que la décision de fermer ou d'annuler l'exécution du flux de travail est la dernière décision envoyée par le décideur. Autrement dit, vous ne pouvez pas avoir de décisions après celle qui ferme le flux de travail.
Lancement des décideurs
Une fois que les décideurs sont développés, vous êtes prêt à en lancer un ou plusieurs.
Pour lancer les décideurs, compressez votre logique de coordination dans un fichier exécutable que vous pouvez utiliser sur la plateforme du décideur. Par exemple, vous pouvez compresser le code du décideur sous forme de fichier exécutable Java que vous pouvez exécuter sur des ordinateurs Linux et Windows.
Une fois lancés, les décideurs doivent commencer à rechercher des tâches dans Amazon SWF. Tant que vous ne démarrez pas les exécutions de flux de travail et qu'Amazon SWF ne planifie pas de tâches de décision, ces recherches excèdent et obtiennent des réponses vides. Une réponse vide est une structure Task
dans laquelle la valeur taskToken
est une chaîne vide. Les décideurs doivent simplement poursuivre les recherches.
Amazon SWF s'assure qu'une seule tâche de décision peut être active pour une exécution de flux de travail à tout moment. Cela empêche les problèmes tels que des décisions contradictoires. En outre, Amazon SWF s'assure qu'une seule tâche de décision est attribuée à un seul décideur, quel que soit le nombre de décideurs en cours d'exécution.
Si un événement qui génère une tâche de décision se produit pendant qu'un décideur traite une autre tâche de décision, Amazon SWF ajoute la nouvelle tâche à une file d'attente jusqu'à ce que celle en cours se termine. Une fois que la tâche en cours est terminée, Amazon SWF met à disposition la nouvelle tâche de décision. En outre, les tâches de décision sont traitées par lot. Autrement dit, si plusieurs activités se terminent lorsqu'un décideur traite une tâche de décision, Amazon SWF ne crée qu'une seule tâche de décision pour représenter l'achèvement de plusieurs tâches. Toutefois, chaque tâche terminée reçoit un événement individuel dans l'historique d'exécution du flux de travail.
Comme les recherches sont des demandes sortantes, les décideurs peuvent s'exécuter sur n'importe quel réseau ayant accès au point de terminaison Amazon SWF.
Pour que les exécutions de flux de travail progressent, au moins un décideur doit être exécuté. Vous pouvez lancer autant de décideurs que vous le souhaitez. Amazon SWF prend en charge l'interrogation de la même liste de tâches par plusieurs décideurs.