

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

# AWS Flow Framework 基本概念：分散式執行
<a name="awsflow-basics-distributed-execution"></a>

*工作流程執行個體*基本上是執行的虛擬執行緒，可以跨越在多部遠端電腦上執行的活動和協同運作邏輯。Amazon SWF 和 AWS Flow Framework 函數是一種作業系統，可透過下列方式管理虛擬 CPU 上的工作流程執行個體：
+ 維護各執行個體的執行狀態。
+ 在執行個體間切換。
+ 在關閉執行個體的當下繼續執行執行個體。

## 重新執行工作流程
<a name="replaying-workflows"></a>

因為活動可以長期執行，所以不會只封鎖工作流程到完成。反之， 會使用*重播*機制來 AWS Flow Framework 管理工作流程執行，該機制倚賴 Amazon SWF 維護的工作流程歷史記錄，在片段中執行工作流程。

每個部分都會以「每項活動只執行一次」**的方式重新執行工作流程邏輯，確保活動和同步方法不執行，直到它們的 [Promise](awsflow-basics-data-exchange-activities-workflows.md) 物件就緒。

工作流程啟動者在啟動工作流程執行時起始第一個重新執行的部分。框架會呼叫工作流程進入點方法以及：

1. 執行所有不依賴活動完成的工作流程任務，包括呼叫所有活動用戶端方法。

1. 為 Amazon SWF 提供要排程執行的活動任務清單。在第一個部分，此清單只包含不依賴 Promise 且可立即執行的活動。

1. 通知 Amazon SWF 片段已完成。

Amazon SWF 會將活動任務存放在工作流程歷史記錄中，並將它們放在活動任務清單上以排程執行。活動工作者輪詢任務清單並執行任務。

當活動工作者完成任務時，會將結果傳回至 Amazon SWF，該結果會記錄在工作流程執行歷史記錄中，並將工作流程工作者的新工作流程任務放在*工作流程*任務清單中，以排程新的工作流程任務。工作流程工作者輪詢任務清單，在它接到任務時執行下一段的重新執行部分，如下所示：

1. 框架會再次執行工作流程進入點方法以及：
   + 執行所有不依賴活動完成的工作流程任務，包括呼叫所有活動用戶端方法。但是框架會檢查執行歷史記錄，卻不排程重複的活動任務。
   + 檢查歷史記錄查看哪些活動任務已完成，執行依賴這些活動的任何非同步工作流程方法。

1. 當可執行的所有工作流程任務都已完成時，架構會向 Amazon SWF 回報：
   + 它為 Amazon SWF 提供自上次事件以來，輸入`Promise<T>`物件已就緒且可排程執行的任何活動清單。
   + 如果該集沒有產生其他活動任務，但仍有未完成的活動，框架會通知 Amazon SWF 該集已完成。然後，它會等待另一項活動完成，初始化下一個重新執行的部分。
   + 如果該集沒有產生其他活動任務且所有活動都已完成，框架會通知 Amazon SWF 工作流程執行已完成。

如需重新執行行為的範例，請參閱「[AWS Flow Framework 適用於 Java 的重播行為](programming-replay.md)」。

## 重新執行和非同步的工作流程方法
<a name="awsflow-basics-distributed-execution-async"></a>

非同步工作流程方法的使用通常很像活動，因為方法會延遲執行直到所有輸入 `Promise<T>` 物件皆就緒。但是，重新執行機制處理非同步方法和處理活動不一樣。
+ 重新執行不保證非同步方法只會執行一次。它會延遲執行非同步方法，直到其輸入 Promise 物件皆就緒，但它接著會針對所有後續部分執行該方法。
+ 當非同步方法完成時，不會開始新的部分。

「[AWS Flow Framework 適用於 Java 的重播行為](programming-replay.md)」中有提供重新執行非同步工作流程的範例。

## 重新執行與工作流程實作
<a name="awsflow-basics-distributed-execution-impl"></a>

大多數情況下，您不需要考慮重新執行機制的細節。它基本上是發生在幕後。不過，重新執行有兩項重要的實作針對您的工作流程實作。
+ 不要使用工作流程方法來執行長期執行的任務，因為重新執行會多次重複該任務。即使是非同步的工作流程方法一般都會執行一次以上。請改用活動處理長期執行的任務，重新執行只會執行一次活動。
+ 您的工作流程邏輯必須是完全確定的，每一個部分都必須採用相同的控制流程路徑。例如，控制流程路徑不應該相依於目前的時間。如需重新執行和確定性要求的詳細說明，請參閱「[不確定性](details.md#details.non)」。