

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

# 基本概念
<a name="durable-basic-concepts"></a>

Lambda 提供適用於 JavaScript、TypeScript 和 Python SDKs。這些 SDKs是建置耐用函數的基礎，提供您檢查點進度、處理重試和管理執行流程所需的基本概念。如需完整的 SDK 文件和範例，請參閱 GitHub 上的 [JavaScript/TypeScript SDK](https://github.com/aws/aws-durable-execution-sdk-js) 和 [Python SDK](https://github.com/aws/aws-durable-execution-sdk-python)。

## 持久性執行
<a name="durable-execution-concept"></a>

**持久性執行**代表 Lambda 持久性函數的完整生命週期，使用檢查點和重播機制來追蹤業務邏輯進度、暫停執行並從失敗中復原。當函數在暫停或中斷後恢復時，會重新播放先前完成的檢查點，且函數會繼續執行。

生命週期可能包含 Lambda 函數的多次調用以完成執行，特別是在暫停或故障復原之後。此方法可讓您的函數長時間執行 （長達一年），同時在中斷的情況下維持可靠的進度。

**重播的運作方式**  
Lambda 會在函數執行時保留所有耐久操作 （步驟、等待和其他操作） 的執行中日誌。當您的函數需要暫停或遇到中斷時，Lambda 會儲存此檢查點日誌並停止執行。恢復時，Lambda 會從頭再次叫用您的函數，並重播檢查點日誌，以儲存的值取代已完成的操作。這表示您的程式碼會再次執行，但先前完成的步驟不會重新執行。而是改用其儲存的結果。

此重播機制對於了解持久功能至關重要。您的程式碼在重播期間必須是確定性的，這表示它在相同的輸入下會產生相同的結果。避免在步驟外出現副作用 （例如產生隨機數字或取得目前時間） 的操作，因為這些操作可能會在重播期間產生不同的值，並導致非確定性的行為。

## DurableContext
<a name="durable-context-concept"></a>

**DurableContext** 是您耐用函數接收的內容物件。它提供持久性操作的方法，例如建立檢查點和管理執行流程的步驟和等待。

您的耐用函數會收到 `DurableContext`而非預設 Lambda 內容：

------
#### [ TypeScript ]

```
import {
  DurableContext,
  withDurableExecution,
} from "@aws/durable-execution-sdk-js";

export const handler = withDurableExecution(
  async (event: any, context: DurableContext) => {
    const result = await context.step(async () => {
      return "step completed";
    });
    return result;
  },
);
```

------
#### [ Python ]

```
from aws_durable_execution_sdk_python import (
    DurableContext,
    durable_execution,
    durable_step,
)

@durable_step
def my_step(step_context, data):
    # Your business logic
    return result

@durable_execution
def handler(event, context: DurableContext):
    result = context.step(my_step(event["data"]))
    return result
```

------

適用於耐用函數的 Python SDK 使用同步方法，不支援 `await`。TypeScript SDK 使用 `async/await`。

## 步驟
<a name="steps-concept"></a>

**步驟**會使用內建重試和自動檢查點來執行商業邏輯。每個步驟都會儲存其結果，確保您的函數可以在中斷後從任何已完成的步驟恢復。

------
#### [ TypeScript ]

```
// Each step is automatically checkpointed
const order = await context.step(async () => processOrder(event));
const payment = await context.step(async () => processPayment(order));
const result = await context.step(async () => completeOrder(payment));
```

------
#### [ Python ]

```
# Each step is automatically checkpointed
order = context.step(lambda: process_order(event))
payment = context.step(lambda: process_payment(order))
result = context.step(lambda: complete_order(payment))
```

------

## 等待狀態
<a name="wait-states-concept"></a>

**等待狀態**是您的函數停止執行 （並停止充電） 的計劃暫停，直到繼續為止。使用它們來等待期間、外部回呼或特定條件。

------
#### [ TypeScript ]

```
// Wait for 1 hour without consuming resources
await context.wait({ seconds:3600 });

// Wait for external callback
const approval = await context.waitForCallback(
  async (callbackId) => sendApprovalRequest(callbackId)
);
```

------
#### [ Python ]

```
# Wait for 1 hour without consuming resources
context.wait(3600)

# Wait for external callback
approval = context.wait_for_callback(
    lambda callback_id: send_approval_request(callback_id)
)
```

------

當您的函數遇到等待或需要暫停時，Lambda 會儲存檢查點日誌並停止執行。恢復時，Lambda 會再次叫用您的函數，並重播檢查點日誌，以儲存的值取代已完成的操作。

對於更複雜的工作流程，耐用的 Lambda 函數也隨附進階操作，例如`parallel()`用於並行執行、`map()`用於處理陣列、`runInChildContext()`用於巢狀操作，以及`waitForCondition()`用於輪詢。如需何時使用每項操作的詳細範例和指引，請參閱[範例](durable-examples.md)。

## 叫用其他 函數
<a name="invoke-concept"></a>

**調用**允許耐用的函數呼叫其他 Lambda 函數，並等待其結果。呼叫函數會在調用函數執行時暫停，建立保留結果的檢查點。這可讓您建置模組化工作流程，讓專門的 函數處理特定任務。

使用 `context.invoke()`從您的耐用函數中呼叫其他函數。調用是檢查點的，因此如果您的函數在調用函數完成後中斷，它會繼續以儲存的結果繼續，而不會重新調用函數。

------
#### [ TypeScript ]

```
// Invoke another function and wait for result
const customerData = await context.invoke(
  'validate-customer',
  'arn:aws:lambda:us-east-1:123456789012:function:customer-service:1',
  { customerId: event.customerId }
);

// Use the result in subsequent steps
const order = await context.step(async () => {
  return processOrder(customerData);
});
```

------
#### [ Python ]

```
# Invoke another function and wait for result
customer_data = context.invoke(
    'arn:aws:lambda:us-east-1:123456789012:function:customer-service:1',
    {'customerId': event['customerId']},
    name='validate-customer'
)

# Use the result in subsequent steps
order = context.step(
    lambda: process_order(customer_data),
    name='process-order'
)
```

------

調用函數可以是耐用或標準 Lambda 函數。如果您叫用持久性函數，呼叫函數會等待完全持久性執行完成。此模式在微服務架構中很常見，其中每個函數都會處理特定網域，讓您從專業、可重複使用的函數編寫複雜的工作流程。

**注意**  
不支援跨帳戶調用。調用函數必須與呼叫函數位於相同的 AWS 帳戶中。

## 耐用的函數組態
<a name="durable-configuration-basic"></a>

耐用函數具有特定的組態設定，可控制執行行為和資料保留。這些設定與標準 Lambda 函數組態分開，並套用至整個耐久執行生命週期。

**DurableConfig** 物件會定義耐用函數的組態：

```
{
  "ExecutionTimeout": Integer,
  "RetentionPeriodInDays": Integer
}
```

### Execution timeout (執行逾時)
<a name="durable-execution-timeout"></a>

**執行逾時**可控制持久性執行從開始到完成的時間長度。這與 Lambda 函數逾時不同，它控制單一函數調用可以執行的時間長度。

當 Lambda 函數通過檢查點、等待和重播時，持久的執行可以跨越多個 Lambda 函數調用。執行逾時適用於持久性執行的總經過時間，不適用於個別函數叫用。

**了解差異**  
Lambda 函數逾時 （最長 15 分鐘） 會限制函數的每個個別調用。持久的執行逾時 （最長 1 年） 會限制從執行開始到完成、失敗或逾時的總時間。在此期間，您的函數可能會在處理步驟、等待並從失敗中復原時被叫用多次。

例如，如果您將持久的執行逾時設定為 24 小時，Lambda 函數逾時設定為 5 分鐘：
+ 每個函數調用必須在 5 分鐘內完成
+ 整個耐久執行最多可執行 24 小時
+ 在這 24 小時內，您的函數可以被叫用多次
+ 等待操作不會計入 Lambda 函數逾時，但會計入執行逾時

您可以使用 Lambda 主控台或 建立耐用函數時 AWS CLI，設定執行逾時 AWS SAM。在 Lambda 主控台中，選擇您的函數，然後選擇組態、持久性執行。以秒為單位設定執行逾時值 （預設值：86400 秒 / 24 小時，最小值：60 秒，最大值：31536000 秒 / 1 年）。

**注意**  
執行逾時和 Lambda 函數逾時的設定不同。Lambda 函數逾時控制每個個別調用可以執行的時間長度 （最長 15 分鐘）。執行逾時控制整個持久性執行的總經過時間 （最長 1 年）。

### 保留期間
<a name="durable-retention-period"></a>

**保留期間**控制 Lambda 在持久性執行完成後保留執行歷史記錄和檢查點資料的時間長度。此資料包含步驟結果、執行狀態和完整的檢查點日誌。

保留期間到期後，Lambda 會刪除執行歷史記錄和檢查點資料。您無法再擷取執行詳細資訊或重播執行。保留期會在執行達到結束狀態 (SUCCEEDED、FAILED、STOPPED 或 TIMED\$1OUT) 時開始。

您可以使用 Lambda 主控台 AWS CLI或 來設定建立耐用函數時的保留期間 AWS SAM。在 Lambda 主控台中，選擇您的函數，然後選擇組態、持久性執行。以天為單位設定保留期間值 （預設值：14 天，下限：1 天，上限：90 天）。

根據您的合規要求、除錯需求和成本考量，選擇保留期。較長的保留期可提供更多偵錯和稽核的時間，但會增加儲存成本。

## 另請參閱
<a name="durable-basic-concepts-see-also"></a>
+ [耐用函數或 Step Functions](durable-step-functions.md) – 比較耐用函數與 Step Functions，以了解每個方法最有效的時機。