本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
透過 Step Functions 活動,您可以在狀態機器中設定任務,其中實際工作是由在 Step Functions 外執行的工作者執行。例如,您可以在 Amazon Elastic Compute Cloud (Amazon EC2)、Amazon Elastic Container Service (Amazon ECS) 或甚至行動裝置上執行工作者程式。
概觀
在 中 AWS Step Functions,活動是將執行某處 (稱為活動工作者) 的程式碼與狀態機器中特定任務建立關聯的一種方式。您可以使用 Step Functions 主控台或呼叫 來建立活動CreateActivity
。這為您的任務狀態提供 Amazon Resource Name (ARN)。使用此 ARN 來輪詢任務狀態,以便在您的活動工作者中使用。
注意
活動並未進行版本控制,應該可與舊版相容。如果您必須對活動進行回溯不相容的變更,請使用唯一名稱在 Step Functions 中建立新的活動。
活動工作者可以是在 Amazon EC2 執行個體、 AWS Lambda 函數、行動裝置上執行的應用程式:任何可以進行 HTTP 連線的應用程式,託管於任何地方。當 Step Functions 達到活動任務狀態時,工作流程會等待活動工作者輪詢任務。活動工作者會使用 輪詢 Step FunctionsGetActivityTask
,並傳送相關活動的 ARN。 GetActivityTask
會傳回包含 input
(任務的 JSON 輸入字串) 和 taskToken
(任務的唯一識別符) 的回應。在活動工作者完成其工作之後,就可以使用 SendTaskSuccess
或 SendTaskFailure
來提供成功或失敗的報告。這兩個呼叫會使用 GetActivityTask
所提供的 taskToken
,將結果與該任務建立關聯。
活動任務的相關 API
Step Functions 提供 APIs用於建立和列出活動、請求任務,以及根據您的工作者結果管理狀態機器的流程。
以下是與活動相關的 Step Functions APIs:
注意
透過 GetActivityTask
輪詢活動任務,可能會導致某些實作延遲。請參閱 避免輪詢活動任務時的延遲。
等待活動任務完成
在任務定義中設定 TimeoutSeconds
,以設定狀態等待的時間長度。若要讓任務保持作用中並且等待,請在 TimeoutSeconds
中設定的時間內使用 SendTaskHeartbeat
,定期從您的活動工作者傳送活動訊號。透過設定長時間逾時持續時間並主動傳送活動訊號,Step Functions 中的活動最多可以等待一年才能完成執行。
例如,如果您需要一個可等待冗長程序結果的工作流程,請執行下列動作:
-
使用主控台來建立活動,或藉由呼叫
CreateActivity
來建立它。記下活動 ARN。 -
在狀態機器定義的活動任務狀態中參考該 ARN,並且設定
TimeoutSeconds
。 -
使用
GetActivityTask
,並且參考該 ARN,以實作可輪詢工作的活動工作者。 -
在您於狀態機器任務定義的
HeartbeatSeconds
中所設定的時間內,定期使用SendTaskHeartbeat
,讓任務不會逾時。 -
開始執行您的狀態機器。
-
啟動您的活動工作者程序。
執行會暫停於活動任務狀態,並等待活動工作者輪詢任務。將 taskToken
提供給活動工作者後,工作流程就會等待 SendTaskSuccess
或 SendTaskFailure
提供狀態。如果在 TimeoutSeconds
中設定的時間前,執行並未收到這些資訊或 SendTaskHeartbeat
呼叫,則執行會失敗且執行歷史記錄中會包含 ExecutionTimedOut
事件。
範例:Ruby 中的活動工作者
下列範例活動工作者程式碼實作消費者生產者模式,其中包含可設定的輪詢器和活動工作者執行緒數量。輪詢器執行緒會持續長時間輪詢 Step Functions 中的活動任務。擷取活動任務時,會通過限制的封鎖佇列,讓活動執行緒接收。
-
如需詳細資訊,請參閱 適用於 Ruby 的 AWS SDK API 參考。
-
如要下載此程式碼和相關資源,請參閱 GitHub 上的 step-functions-ruby-activity-worker
儲存庫。
下列程式碼是 Ruby 活動工作者範例的主要進入點。
require_relative '../lib/step_functions/activity
'
credentials = Aws::SharedCredentials.new
region = 'us-west-2
'
activity_arn = 'ACTIVITY_ARN
'
activity = StepFunctions::Activity.new(
credentials: credentials,
region: region,
activity_arn: activity_arn,
workers_count: 1,
pollers_count: 1,
heartbeat_delay: 30
)
# Start method block contains your custom implementation to process the input
activity.start do |input|
{ result: :SUCCESS, echo: input['value'] }
end
您必須指定活動 ARN 和區域。程式碼包含您可以設定的預設值,例如執行緒和活動訊號延遲的數量。
項目 | 描述 |
---|---|
|
以下範例活動工作者程式碼的相對路徑。 |
|
AWS 活動的區域。 |
|
您的活動工作者的執行緒數目。對於大多數實作,10 到 20 個執行緒應該就足夠。處理活動所需的時間越長,就可能需要更多執行緒。預估時,以每秒處理的活動數目乘以第 99 個百分位數活動處理延遲 (以秒為單位)。 |
|
您的輪詢器的執行緒數目。對於大多數實作,10 到 20 個執行緒應該就足夠。 |
|
活動訊號之間的延遲 (以秒為單位)。 |
input |
實作您的活動邏輯。 |
後續步驟
如要詳細了解建立使用活動工作者的狀態機器,請參閱: