

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

# 在適用於 Rust 的 AWS SDK 中設定逾時
<a name="timeouts"></a>

SDK AWS for Rust 提供多種設定，用於管理 AWS 服務 請求逾時和停滯的資料串流。這些可協助您的應用程式在網路中發生意外的延遲和故障時，以最佳方式運作。

## API 逾時
<a name="api-timeouts"></a>

當暫時性問題可能導致請求嘗試長時間或完全失敗時，請務必檢閱和設定逾時，以便您的應用程式可以快速失敗並採取最佳行為。開發套件可以自動重試失敗的請求。最佳實務是設定個別嘗試和整個請求的逾時。

SDK for Rust 提供預設逾時，用於建立請求的連線。開發套件沒有為接收請求嘗試或整個請求的回應設定任何預設最長等待時間。可使用下列逾時選項：


| 參數 | 預設值 | Description | 
| --- | --- | --- | 
| 連線逾時 | 3.1 秒 | 放棄之前等待建立連線的時間上限。 | 
| 操作逾時 | 無 | 從適用於 Rust 的 SDK 接收回應之前所等待的時間上限，包括所有重試。 | 
| 操作嘗試逾時 | 無 | 等待單一 HTTP 嘗試的時間上限，之後可重試 API 呼叫。 | 
| 讀取逾時 | 無 | 從請求啟動時間開始，等待讀取回應第一個位元組的時間上限。 | 

下列範例顯示具有自訂逾時值的 Amazon S3 用戶端組態：

```
let config = aws_config::defaults(BehaviorVersion::latest())
    .timeout_config(
        TimeoutConfig::builder()
            .operation_timeout(Duration::from_secs(5))
            .operation_attempt_timeout(Duration::from_millis(1500))
            .build()
    )
    .load()
    .await;

let s3 = aws_sdk_s3::Client::new(&config);
```

當您同時使用 操作和嘗試逾時時，您可以針對所有重試嘗試所花費的總時間設定硬性限制。您也可以將個別 HTTP 請求設定為在慢速請求上快速失敗。

除了在所有 操作的服務用戶端上設定這些逾時值之外，您也可以[針對單一請求 設定或覆寫這些](peroperation.md)逾時值。

**重要**  
操作和嘗試逾時不適用於在 SDK for Rust 傳回回應之後使用的串流資料。例如，從回應`ByteStream`的成員取用資料不會受到操作逾時的影響。

## 停滯的串流保護
<a name="stalled-stream-protection"></a>

SDK for Rust 提供另一種與偵測停滯串流相關的逾時形式。停滯串流是一種上傳或下載串流，不會產生超過設定的寬限期的資料。這有助於防止應用程式無限期地懸置，且永遠不會進行進度。

 當串流閒置的時間超過可接受的期間時，停滯的串流保護將傳回錯誤。

依預設，適用於 Rust 的 SDK 會針對上傳和下載啟用停滯的串流保護，並尋找至少 1 位元組/秒的活動，並有 20 秒的寬廣寬限期。

下列範例顯示的自訂 `StalledStreamProtectionConfig`會停用上傳保護，並將沒有活動的寬限期變更為 10 秒：

```
let config = aws_config::defaults(BehaviorVersion::latest())
    .stalled_stream_protection(
        StalledStreamProtectionConfig::enabled()
            .upload_enabled(false)
            .grace_period(Duration::from_secs(10))
            .build()
    )
    .load()
    .await;
```

**警告**  
停滯的串流保護是進階組態選項。建議您只在應用程式需要更緊密的效能，或造成其他問題時，才變更這些值。

### 停用停滯的串流保護
<a name="disable-stalled-stream-protection"></a>

下列範例示範如何完全停用停滯的串流保護：

```
let config = aws_config::defaults(BehaviorVersion::latest())
    .stalled_stream_protection(StalledStreamProtectionConfig::disabled())
    .load()
    .await;
```