

AWS Mainframe Modernization Service （受管執行期環境體驗） 不再向新客戶開放。對於與 AWS Mainframe Modernization Service （受管執行期環境體驗） 類似的功能，探索 AWS Mainframe Modernization Service （自我管理體驗）。現有客戶可以繼續正常使用該服務。如需詳細資訊，請參閱[AWS 大型主機現代化可用性變更](https://docs.aws.amazon.com/m2/latest/userguide/mainframe-modernization-availability-change.html)。

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

# 設定大型主機執行期 AWS 轉換的速率限制
<a name="ba-runtime-rate-limiting"></a>

AWS 大型主機執行期的轉換包含內建速率限制功能，可保護 gapwalk 應用程式免於過度請求和潛在的濫用。速率限制系統使用權杖儲存貯體演算法來提供高載容量和持續速率限制。

**Topics**
+ [速率限制概觀](#ba-runtime-rate-limiting-overview)
+ [組態屬性](#ba-runtime-rate-limiting-config)
+ [啟用速率限制](#ba-runtime-rate-limiting-enable)
+ [用戶端識別](#ba-runtime-rate-limiting-client-id)
+ [速率限制標頭](#ba-runtime-rate-limiting-headers)
+ [記憶體管理](#ba-runtime-rate-limiting-memory)

## 速率限制概觀
<a name="ba-runtime-rate-limiting-overview"></a>

速率限制系統提供下列功能：

**權杖儲存貯體演算法**  
+ 允許爆量流量達到設定的爆量容量
+ 根據每分鐘請求，以穩定速率補充字符
+ 提供順暢的速率限制，而不會封鎖合法流量峰值

**用戶端識別**  
+ 使用代理支援依 IP 地址識別用戶端
+ 支援 X-Forwarded-For 和 X-Real-IP 標頭
+ 處理負載平衡器和反向代理案例

**自動記憶體管理**  
+ 自動清除過期的速率限制儲存貯體
+ 可設定的清除間隔和到期時間
+ 防止長時間執行應用程式中的記憶體流失

**HTTP 整合**  
+ 超過限制時傳回 HTTP 429 （太多請求）
+ 在回應中包含標準速率限制標頭
+ 提供用戶端的重試後資訊

## 組態屬性
<a name="ba-runtime-rate-limiting-config"></a>

在 `application-main.yaml` 檔案中設定速率限制：

```
gapwalk:
  ratelimiting:
    enabled: true                                        # Enable/disable rate limiting
    requestsPerMinute: 1000                              # Sustained rate limit per minute
    burstCapacity: 1500                                  # Maximum burst requests allowed
    includeHeaders: true                                 # Include X-RateLimit-* headers
    cleanupIntervalMinutes: 5                            # Cleanup interval for expired buckets
    bucketExpiryHours: 1                                 # Hours after which unused buckets expire
    errorMessage: "Too many requests. Try again later."  # Custom error message
    whitelistIps: ""                                     # Comma-separated IPs to bypass limiting
    perEndpointLimiting: false                           # Apply limits per endpoint (not implemented)
```

### 屬性描述
<a name="ba-runtime-rate-limiting-config-properties"></a>

**已啟用**  
主要切換以啟用或停用速率限制功能。預設：`false`

**requestsPerMinute**  
允許持續速率限制的每分鐘請求數。這表示字符重新填充率。預設：`1000`

**burstCapacity**  
在套用速率限制之前，爆量中允許的請求數量上限。應高於 `requestsPerMinute`以允許流量尖峰。預設：`1500`

**includeHeaders**  
是否要在 HTTP 回應中包含標準速率限制標頭 (`X-RateLimit-Limit`、`X-RateLimit-Remaining`、`X-RateLimit-Reset`)。預設：`true`

**cleanupIntervalMinutes**  
自動清除過期速率限制儲存貯體之間的間隔，以分鐘為單位。有助於防止記憶體洩漏。預設：`5`

**bucketExpiryHours**  
未使用的費率限制儲存貯體視為過期且符合清除資格的時數。預設：`1`

**errorMessage**  
超過速率限制時，在 JSON 回應中傳回的自訂錯誤訊息。預設：`"Too many requests. Try again later."`

**whitelistIps**  
以逗號分隔的 IP 地址清單，完全略過速率限制。適用於運作狀態檢查或信任的系統。預設：`empty`

**perEndpointLimiting**  
是否針對每個端點套用個別的速率限制，而不是僅針對每個用戶端套用個別的速率限制。目前未實作。預設：`false`

## 啟用速率限制
<a name="ba-runtime-rate-limiting-enable"></a>

若要使用預設設定啟用速率限制：

```
gapwalk:
  ratelimiting:
    enabled: true
```

## 用戶端識別
<a name="ba-runtime-rate-limiting-client-id"></a>

速率限制系統會使用下列優先順序來識別用戶端：

1. **X-Forwarded-For 標頭** （如果以逗號分隔，則為第一個 IP)

1. **X-Real-IP 標頭**

1. 來自 HTTP 請求的**遠端地址** 

這可確保應用程式落後時適當的用戶端識別：
+ 負載平衡器
+ 反向代理
+ CDNs
+ API 閘道

### 用戶端識別範例
<a name="ba-runtime-rate-limiting-client-id-example"></a>

```
# Direct connection
Client IP: 192.168.1.100

# Behind load balancer with X-Forwarded-For
X-Forwarded-For: 203.0.113.45, 192.168.1.100
Client IP: 203.0.113.45 (first IP used)

# Behind reverse proxy with X-Real-IP
X-Real-IP: 203.0.113.45
Client IP: 203.0.113.45
```

## 速率限制標頭
<a name="ba-runtime-rate-limiting-headers"></a>

啟用 `includeHeaders` 時，下列標頭會新增至 HTTP 回應：

**X-RateLimit-Limit**  
用戶端的速率限制上限 （每分鐘請求數）

**X-RateLimit-Remaining**  
目前速率限制時段中剩餘的請求數量

**X-RateLimit-Reset**  
速率限制時段重設的時間 (Unix 時間戳記）

### 回應標頭範例
<a name="ba-runtime-rate-limiting-headers-example"></a>

```
X-RateLimit-Limit: 1000
X-RateLimit-Remaining: 847
X-RateLimit-Reset: 1640995200
```

### 超出速率限制的回應
<a name="ba-runtime-rate-limiting-headers-exceeded"></a>

超過速率限制時，系統會傳回：

**HTTP 狀態**  
429 太多請求

**內容類型**  
application/json

**重試後**  
重試前要等待的秒數

```
{
  "error": "Rate limit exceeded",
  "message": "Too many requests. Try again later.",
  "retryAfter": 60,
  "timestamp": 1640995140000
}
```

## 記憶體管理
<a name="ba-runtime-rate-limiting-memory"></a>

速率限制系統會自動管理記憶體，以防止長時間執行的應用程式發生洩漏：

**自動清除**  
+ 每分鐘執行`cleanupIntervalMinutes`一次
+ 移除未使用的儲存貯體數`bucketExpiryHours`小時
+ 記錄用於監控的清除活動

**記憶體效率**  
+ 使用並行資料結構確保執行緒安全
+ 建立延遲儲存貯體 （僅在需要時）
+ 有效率的字符儲存貯體實作

### 監控清除活動
<a name="ba-runtime-rate-limiting-memory-monitoring"></a>

檢查清除訊息的日誌：

```
INFO  RateLimitingService - Cleaned up 15 expired rate limiting buckets
```