Amazon SWF에서 결정자 개발 - Amazon Simple Workflow Service

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

Amazon SWF에서 결정자 개발

결정자는 워크플로 실행 중 실행되는 워크플로 유형의 조정 로직을 구현하는 것입니다. 한 가지 워크플로 유형에 대해 여러 결정자를 실행할 수 있습니다.

워크플로 실행의 실행 상태는 워크플로 기록에 저장되므로 결정자는 상태 비저장 상태가 될 수 있습니다. Amazon SWF는 워크플로 실행 기록을 유지 관리하고 이를 각 의사 결정 작업과 함께 결정자에게 제공합니다. 따라서 필요에 따라 결정자를 동적으로 추가 및 제거할 수 있어 워크플로 처리의 확장 가능성이 매우 커집니다. 시스템에 대한 로드가 증가하면 결정자를 추가해 늘어난 용량을 처리할 수 있습니다. 그러나 워크플로 실행 중 결정 작업은 하나만 열려 있을 수 있습니다.

워크플로 실행에 대한 상태가 변경될 때마다 Amazon SWF는 결정 작업을 예약합니다. 결정자는 결정 작업을 수신할 때마다 다음 작업을 수행합니다.

  • 결정 작업과 함께 제공된 워크플로 실행 내역 해석

  • 워크플로 실행 내역을 기반으로 조정 로직 적용 및 다음으로 수행할 작업 결정. 각 결정은 결정 구조로 표현됩니다.

  • 결정 작업 완료 및 Amazon SWF에 결정 목록 제공

이 단원에서는 결정자를 개발하는 방법을 설명하고, 여기에는 다음 작업이 관련됩니다.

  • 결정 작업을 폴링하도록 결정자 프로그래밍

  • 워크플로 실행 내역을 해석하고 결정을 하도록 결정자 프로그래밍

  • 결정 작업에 대해 응답하도록 결정자 프로그래밍

이 단원의 예에서는 전자 상거래의 예 워크플로에 대한 결정자를 프로그래밍할 수 있는 방법을 보여줍니다.

원하는 언어로 결정자를 구현하고, 서비스 API를 통해 Amazon SWF와 통신할 수 있는 한 어디에서나 이를 실행할 수 있습니다.

조정 로직 정의

결정자를 개발할 때 해야 할 첫 번째 작업은 조정 로직을 정의하는 것입니다. 전자 상거래의 예에서 이전 활동 완료 후 수행될 각 활동을 예약하는 조정 로직은 다음과 같을 수 있습니다.

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

결정자는 워크플로 실행 내역에 조정 로직을 적용해 RespondDecisionTaskCompleted 작업을 사용해 결정 작업 완료 시 결정 목록을 생성합니다.

결정 작업 폴링

각 결정자는 결정 작업을 폴링합니다. 결정 작업에는 결정자가 활동 작업 예약 등과 같은 결정을 생성하는 데 사용하는 정보가 들어 있습니다. 결정 작업을 폴링하기 위해 결정자는 PollForDecisionTask 작업을 사용합니다.

이 예에서 결정자는 결정 작업을 폴링해 customerOrderWorkflow-0.1 작업 목록을 지정합니다.

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

지정된 작업 목록에서 결정 작업을 사용할 수 있으면 Amazon SWF에서 해당 작업을 즉시 반환합니다. 사용 가능한 결정 작업이 없는 경우 Amazon SWF는 최대 60초 동안 연결을 열린 상태로 유지하고 작업을 사용할 수 있게 되면 즉시 반환합니다. 사용 가능한 작업이 없는 경우 Amazon SWF는 빈 응답을 반환합니다. 빈 응답은 Task 구조로, 여기서 taskToken의 값이 빈 문자열입니다. 결정자가 빈 응답을 수신하면 다른 작업을 폴링하도록 결정자를 프로그래밍해야 합니다.

결정 작업을 사용할 수 있는 경우 Amazon SWF는 결정 작업과 워크플로 실행 내역의 페이지를 매긴 보기가 포함된 응답을 반환합니다.

이 예에서 최신 이벤트 유형은 워크플로 실행이 시작되었으며 입력 요소에 첫 번째 작업을 수행하는 데 필요한 정보가 포함되어 있음을 나타냅니다.

{ "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" } } } ], ... }

워크플로 실행 내역을 수신하면 결정자는 내역을 해석하고 조정 로직에 따라 결정을 내립니다.

워크플로 실행 하나의 워크플로 내역 이벤트 수가 많은 경우, 결과가 여러 페이지로 나뉘어 반환될 수 있습니다. 후속 페이지를 검색하려면 초기 호출에서 반환된 nextPageToken을 사용하여 추가로 PollForDecisionTask을 직접적으로 호출합니다. 참고: nextPageToken을 사용하여 GetWorkflowExecutionHistory을 직접적으로 호출하지 마십시오. 그 대신 PollForDecisionTask를 다시 호출하십시오.

조정 로직 적용

결정 작업을 받은 결정자가 워크플로 실행 내역을 해석해 지금까지 어떤 일이 발생했는지 확인하도록 결정자를 프로그래밍합니다. 결정자는 이를 바탕으로 결정 목록을 생성해야 합니다.

전자 상거래의 예에서는 워크플로 내역의 마지막 이벤트만 고려하므로 다음 로직을 정의합니다.

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

lastEvent가 CompleteVerifyOrderActivity이면 결정 목록에 ScheduleChargeCreditCardActivity 활동을 추가합니다.

결정자가 어떤 결정을 내릴지 결정하면 Amazon SWF에 적절한 결정으로 응답할 수 있습니다.

결정에 응답

워크플로 내역을 해석하고 결정 목록을 생성하면 결정자는 해당 결정으로 다시 Amazon SWF에 응답할 준비가 된 것입니다.

프로그램 실행 내역에서 필요한 데이터를 추출한 다음 워크플로에 적절한 다음 작업을 지정하도록 결정자를 프로그래밍합니다. 결정자는 RespondDecisionTaskCompleted 작업을 사용하여 이러한 결정을 Amazon SWF로 다시 전송합니다. 사용 가능한 결정 유형 목록은 Amazon Simple Workflow Service API 참조를 참조하십시오.

이 전자 상거래의 예에서 결정자가 자신이 생성한 결정 세트로 응답할 때 워크플로 실행 내역의 신용카드 입력을 포함합니다. 그러면 활동 작업자는 활동 작업을 수행하는 데 필요한 정보를 갖게 됩니다.

워크플로 실행의 모든 활동이 완료되면 결정자는 워크플로 실행을 닫습니다.

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" } } ] }

워크플로 실행 닫기

결정자가 비즈니스 프로세스가 완료되었음을 확인하면 즉, 수행할 활동이 더 이상 없음을 확인하면 결정자는 워크플로 실행을 닫는 결정을 생성합니다.

워크플로 실행을 닫으려면 워크플로 내역의 이벤트를 해석해 지금까지 실행에서 발생한 일을 확인해 워크플로 실행을 닫아야 하는지 살펴보도록 결정자를 프로그래밍합니다.

워크플로가 성공적으로 완료되면 CompleteWorkflowExecution 결정으로 RespondDecisionTaskCompleted를 호출해 워크플로 실행을 닫습니다. 또는 FailWorkflowExecution 결정을 사용해 잘못된 실행을 실패로 처리할 수 있습니다.

이 전자 상거래의 예에서 결정자는 내역을 검토하고 조정 로직을 기반으로 결정 목록에 워크플로 실행을 닫는 결정을 추가하고, 워크플로 닫기 결정으로 RespondDecisionTaskCompleted 작업을 시작합니다.

참고

워크플로 실행 닫기에 실패하는 몇 가지 경우가 있습니다. 예를 들어 결정자가 워크플로 실행을 닫는 중 신호를 수신하면 닫기 결정에 실패합니다. 이러한 가능성을 처리하기 위해 결정자는 계속해서 결정 작업을 폴링해야 합니다. 또한 다음 결정 작업을 수신하는 결정자가 실행 종료를 방해한 이벤트(이 경우에는 신호)에 응답하는지 확인합니다.

또한 워크플로 실행의 취소를 지원할 수도 있습니다. 이러한 기능은 오래 실행 중인 워크플로에 특히 유용할 수 있습니다. 취소를 지원하려면 결정자가 내역의 WorkflowExecutionCancelRequested 이벤트를 처리해야 합니다. 이 이벤트는 실행 취소가 요청되었음을 나타냅니다. 결정자는 진행 중인 활동 작업 취소와 CancelWorkflowExecution 결정으로 RespondDecisionTaskCompleted 작업을 호출해 워크플로 닫기 등과 같은 적절한 정리 작업을 수행해야 합니다.

다음 예에서는 RespondDecisionTaskCompleted를 호출해 현재 워크플로 실행이 취소되었음을 지정합니다.

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

Amazon SWF는 워크플로 실행 닫기 또는 취소 결정이 결정자가 보낸 마지막 결정인지 확인합니다. 즉, 워크플로를 닫는 결정 이후에는 결정이 들어 있는 결정 세트가 있으면 잘못된 것입니다.

결정자 시작

결정자 개발을 완료하면 하나 이상의 결정자를 시작할 준비가 된 것입니다.

결정자를 시작하려면 결정자 플랫폼에서 사용할 수 있는 실행 파일로 조정 로직을 패키징합니다. 예를 들어, Linux 및 Windows 컴퓨터 양쪽 모두에서 실행할 수 있는 Java 실행 파일로 결정자 코드를 패키징할 수 있습니다.

시작되면 결정자는 작업을 위해 Amazon SWF를 폴링하기 시작해야 합니다. 사용자가 워크플로 실행을 시작하고 Amazon SWF에서 결정 작업을 예약할 때까지 이러한 폴링은 시간 초과되어 빈 응답을 받습니다. 빈 응답은 Task 구조로, 여기서 taskToken의 값이 빈 문자열입니다. 결정자는 계속해서 폴링해야 합니다.

Amazon SWF는 항상 하나의 워크플로 실행에 대해 결정 작업을 하나만 활성화할 수 있도록 합니다. 따라서 결정 충돌과 같은 문제가 방지됩니다. 또한 Amazon SWF는 실행 중인 결정자 수에 상관없이 결정자 하나에는 결정 작업이 하나만 할당되도록 합니다.

결정자가 다른 결정 작업을 처리하는 동안 결정 작업 하나를 발생시키는 어떤 일이 일어나면 Amazon SWF는 현재 작업이 완료될 때까지 새 작업을 대기열에 추가합니다. 현재 작업이 완료되면 Amazon SWF는 새 결정 작업을 사용 가능하도록 만듭니다. 또한 결정 작업은 일괄 처리됩니다. 즉, 결정자가 결정 작업을 처리하는 동안 여러 활동이 완료되면 Amazon SWF는 여러 작업 완료를 고려하는 새로운 결정 작업을 하나만 생성합니다. 그러나 워크플로 실행 내역에는 각 작업 완료에 대한 개별 이벤트가 수신됩니다.

폴링은 아웃바운드 요청이기 때문에 Amazon SWF 엔드포인트에 액세스할 수 있는 모든 네트워크에서 결정자를 실행할 수 있습니다.

워크플로 실행을 진행하도록 하려면 결정자가 하나 이상 실행 중이어야 합니다. 원하는 만큼 결정자를 실행할 수 있습니다. Amazon SWF는 동일한 작업 목록에 대한 여러 결정자 폴링을 지원합니다.