使用 Amazon Simple Workflow Service 實作互斥選項 - Amazon Simple Workflow Service

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用 Amazon Simple Workflow Service 實作互斥選項

在某些情況下,您可能想要根據先前活動的結果來排定一組不同的活動。互斥選項模式可讓您為複雜的應用程式要求建立相符的彈性工作流程。

Amazon Simple Workflow Service (Amazon SWF) 沒有特定的互斥選項操作。若要使用互斥選項,您只需要撰寫決策者邏輯,從而根據先前活動的結果做出不同的決策。互斥選項的一些應用如下:

  • 如果先前活動的結果未成功,則執行清理活動

  • 根據客戶購買基本還是進階方案來排定不同的活動

  • 根據客戶的訂購歷史記錄來執行不同的客戶身份驗證活動

在電子商務範例中,您可以根據收取信用卡費用的結果,使用互斥選項來送出或取消訂單。在下圖中,如果成功收取信用卡費用,則決策者將排定「送出訂單」和「記錄完成」活動任務。否則,決策者將排定「取消訂單」和「發送電子郵件給客戶」活動任務。

客戶訂單工作流程圖表

如果成功收取信用卡費用,則決策者會排定 ShipOrder 活動。否則,決策者會排定 CancelOrder 活動。

在此情況下,以程式設計決策者解譯歷史記錄,並判斷是否成功收取信用卡費用。若要這麼做,您的邏輯可能與下面類似:

IF lastEvent = "WorkflowExecutionStarted" addToDecisions ScheduleActivityTask(ActivityType = "VerifyOrderActivity") ELSIF lastEvent = "ActivityTaskCompleted" AND ActivityType = "VerifyOrderActivity" addToDecisions ScheduleActivityTask(ActivityType = "ChargeCreditCardActivity") #Successful Credit Card Charge Activities ELSIF lastEvent = "ActivityTaskCompleted" AND ActivityType = "ChargeCreditCardActivity" addToDecisions ScheduleActivityTask(ActivityType = "ShipOrderActivity") ELSIF lastEvent = "ActivityTaskCompleted" AND ActivityType = "ShipOrderActivity" addToDecisions ScheduleActivityTask(ActivityType = "RecordOrderCompletionActivity") ELSIF lastEvent = "ActivityTaskCompleted" AND ActivityType = "RecordOrderCompletionActivity" addToDecisions CompleteWorkflowExecution #Unsuccessful Credit Card Charge Activities ELSIF lastEvent = "ActivityTaskFailed" AND ActivityType = "ChargeCreditCardActivity" addToDecisions ScheduleActivityTask(ActivityType = "CancelOrderActivity") ELSIF lastEvent = "ActivityTaskCompleted" AND ActivityType = "CancelOrderActivity" addToDecisions ScheduleActivityTask(ActivityType = "EmailCustomerActivity") ELSIF lastEvent = "ActivityTaskCompleted" AND ActivityType = "EmailCustomerActivity" addToDecisions CompleteWorkflowExecution ENDIF

如果成功收取信用卡費用,則決策者應該回應 RespondDecisionTaskCompleted 來排定 ShipOrder 活動。

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":"ShipOrder", "version":"2.4" }, "activityId":"3e2e6e55-e7c4-fee-deed-aa815722b7be", "scheduleToCloseTimeout":"3600", "taskList":{ "name":"SHIPPING" }, "scheduleToStartTimeout":"600", "startToCloseTimeout":"3600", "heartbeatTimeout":"300", "input": "123 Main Street, Anytown, United States" } } ] }

如果未成功收取信用卡費用,則決策者應該回應 RespondDecisionTaskCompleted 來排定 CancelOrder 活動。

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":"CancelOrder", "version":"2.4" }, "activityId":"3e2e6e55-e7c4-fee-deed-aa815722b7be", "scheduleToCloseTimeout":"3600", "taskList":{ "name":"CANCELLATIONS" }, "scheduleToStartTimeout":"600", "startToCloseTimeout":"3600", "heartbeatTimeout":"300", "input": "Out of Stock" } } ] }

如果 Amazon SWF 能驗證RespondDecisionTaskCompleted操作,Amazon SWF 會傳回與下列類似的成功 HTTP 響應。

HTTP/1.1 200 OK Content-Length: 11 Content-Type: application/json x-amzn-RequestId: 93cec6f7-0747-11e1-b533-79b402604df1