分享方式:


服務探索復原能力

透過 Azure 容器應用程式復原能力,您可以使用簡單的復原原則,主動預防、偵測服務要求失敗並從中復原。 在本文中,您會了解如何在使用 Azure 容器應用程式服務探索起始要求時設定 Azure 容器應用程式復原原則。

注意

目前,復原原則無法套用至使用 Dapr 服務叫用 API 提出的要求。

針對容器應用程式的每個要求,原則皆會生效。 您可以使用下列設定,針對接受要求的容器應用程式量身打造原則:

  • 重試次數
  • 重試及逾時持續時間
  • 重試比對
  • 斷路器連續錯誤和其他錯誤

下列螢幕擷取畫面顯示應用程式如何使用重試原則嘗試從失敗的要求中復原。

使用容器應用程式服務名稱示範容器應用程式到容器應用程式復原的圖表。

支援的復原原則

設定復原原則

無論您使用 Bicep、CLI 或 Azure 入口網站設定復原原則,每個容器應用程式只能套用一個原則。

當您將原則套用至容器應用程式時,會將規則套用至對該容器應用程式發出的所有要求,而非從該容器應用程式提出的要求。 例如,針對名為 App B 的容器應用程式套用重試原則, 則向應用程式 B 發出的所有輸入要求都會在失敗時自動重試。 不過,由應用程式 B 提出的輸出要求不保證會在失敗時重試。

下列復原範例示範所有可用設定。

resource myPolicyDoc 'Microsoft.App/containerApps/resiliencyPolicies@2023-11-02-preview' = {
  name: 'my-app-resiliency-policies'
  parent: '${appName}'
  properties: {
    timeoutPolicy: {
        responseTimeoutInSeconds: 15
        connectionTimeoutInSeconds: 5
    }
    httpRetryPolicy: {
        maxRetries: 5
        retryBackOff: {
          initialDelayInMilliseconds: 1000
          maxIntervalInMilliseconds: 10000
        }
        matches: {
            headers: [
                {
                    header: 'x-ms-retriable'
                    match: { 
                        exactMatch: 'true'
                    }
                }
            ]
            httpStatusCodes: [
                502
                503
            ]
            errors: [
                'retriable-status-codes'
                '5xx'
                'reset'
                'connect-failure'
                'retriable-4xx'
            ]
        }
    } 
    tcpRetryPolicy: {
        maxConnectAttempts: 3
    }
    circuitBreakerPolicy: {
        consecutiveErrors: 5
        intervalInSeconds: 10
        maxEjectionPercent: 50
    }
    tcpConnectionPool: {
        maxConnections: 100
    }
    httpConnectionPool: {
        http1MaxPendingRequests: 1024
        http2MaxRequests: 1024
    }
  }
}

原則規格

逾時

逾時可用於提前終止長時間執行的作業。 逾時原則包括下列屬性。

properties: {
  timeoutPolicy: {
      responseTimeoutInSeconds: 15
      connectionTimeoutInSeconds: 5
  }
}
中繼資料 必要 描述 範例
responseTimeoutInSeconds Yes 等候容器應用程式回應逾時。 15
connectionTimeoutInSeconds Yes 與容器應用程式建立連線逾時。 5

重試

定義失敗作業的 tcpRetryPolicyhttpRetryPolicy 策略。 重試原則包含下列設定。

httpRetryPolicy

properties: {
    httpRetryPolicy: {
        maxRetries: 5
        retryBackOff: {
          initialDelayInMilliseconds: 1000
          maxIntervalInMilliseconds: 10000
        }
        matches: {
            headers: [
                {
                    header: 'x-ms-retriable'
                    match: { 
                       exactMatch: 'true'
                    }
                }
            ]
            httpStatusCodes: [
                502
                503
            ]
            errors: [
                'retriable-headers'
                'retriable-status-codes'
            ]
        }
    } 
}
中繼資料 必要 描述 範例
maxRetries Yes 針對失敗的 http-request 執行重試次數上限。 5
retryBackOff Yes 監視要求,並在符合逾時和重試準則時關閉受影響服務的所有流量。 N/A
retryBackOff.initialDelayInMilliseconds Yes 第一次錯誤與第一次重試之間的延遲。 1000
retryBackOff.maxIntervalInMilliseconds Yes 重試之間的延遲上限。 10000
matches Yes 設定比對值以限制應用程式何時應嘗試重試。 headers、 、 httpStatusCodeserrors
matches.headers Y* 當錯誤回應包含特定標頭時重試。 *只有在您指定 retriable-headers 錯誤屬性時,標頭才是必要屬性。 深入了解可用標頭比對。 X-Content-Type
matches.httpStatusCodes Y* 當回應傳回特定狀態碼時重試。 *只有在您指定 retriable-status-codes 錯誤屬性時,狀態碼才是必要屬性。 502, 503
matches.errors Yes 只有在應用程式傳回特定錯誤時才會重試。 深入了解可用錯誤。 connect-failure, reset
標頭比對

如果您指定了 retriable-headers 錯誤,則可在回應包含特定標頭時,使用下列標頭比對屬性重試。

matches: {
  headers: [
    { 
      header: 'x-ms-retriable'
      match: {
        exactMatch: 'true'
      }
    }
  ]
}
中繼資料 描述
prefixMatch 重試是根據標頭值的前置詞而執行。
exactMatch 重試是根據標頭值的完全相符而執行。
suffixMatch 重試是根據標頭值的尾碼而執行。
regexMatch 重試是根據規則運算式規則而執行,其中標頭值必須符合 RegEx 模式。
錯誤

您可以對下列任何錯誤執行重試:

matches: {
  errors: [
    'retriable-headers'
    'retriable-status-codes'
    '5xx'
    'reset'
    'connect-failure'
    'retriable-4xx'
  ]
}
中繼資料 描述
retriable-headers 觸發重試的 HTTP 回應標頭。 如果任何標頭比對符合回應標頭,則會執行重試。 如果您想重試任何比對標頭,則為必要項目。
retriable-status-codes 應觸發重試的 HTTP 狀態碼。 如果您想重試任何比對狀態碼,則為必要項目。
5xx 如果伺服器回應任何 5xx 回應碼,則會重試。
reset 如果伺服器未回應,則會重試。
connect-failure 如果與容器應用程式連線錯誤而導致要求失敗,則會重試。
retriable-4xx 如果容器應用程式回應 400 系列回應碼 (例如 409),則會重試。

tcpRetryPolicy

properties: {
    tcpRetryPolicy: {
        maxConnectAttempts: 3
    }
}
中繼資料 必要 描述 範例
maxConnectAttempts Yes 設定連線嘗試次數上限 (maxConnectionAttempts) 以重試失敗連線。 3

斷路器

斷路器原則會根據連續錯誤數目等觸發程序,指定容器應用程式複本是否暫時從負載平衡集區中移除。

properties: {
    circuitBreakerPolicy: {
        consecutiveErrors: 5
        intervalInSeconds: 10
        maxEjectionPercent: 50
    }
}
中繼資料 必要 描述 範例
consecutiveErrors Yes 容器應用程式複本暫時從負載平衡中移除之前發生的連續錯誤數目。 5
intervalInSeconds Yes 指定判斷複本是否從負載平衡集區中移除或還原的時間長度。 10
maxEjectionPercent Yes 從負載平衡中退出的容器應用程式複本失敗百分比上限。 無論值為何,至少會移除一部主機。 50

連線集區

Azure 容器應用程式的連線共用會維護容器應用程式已建立且可重複使用的連線集區。 此連線集區可減少為每個要求建立及卸除個別連線的額外負荷。

連線集區可讓您指定服務允許的要求或連線數目上限。 這些限制可控制每個服務的並行連線總數。 達到此限制時,除非釋出或關閉現有連線,否則不會建立與該服務的新連線。 透過此連線管理流程,可防止資源承受的要求超出負荷,並維護有效率的連線管理。

httpConnectionPool

properties: {
    httpConnectionPool: {
        http1MaxPendingRequests: 1024
        http2MaxRequests: 1024
    }
}
中繼資料 必要 描述 範例
http1MaxPendingRequests Yes 用於 http1 要求。 容器應用程式的開啟連線數目上限。 1024
http2MaxRequests Yes 用於 http2 要求。 容器應用程式的並行要求數目上限。 1024

tcpConnectionPool

properties: {
    tcpConnectionPool: {
        maxConnections: 100
    }
}
中繼資料 必要 描述 範例
maxConnections Yes 容器應用程式的並行連線數目上限。 100

復原可檢視性

您可以透過容器應用程式的計量和系統記錄檔,執行復原可檢視性。

復原記錄

從容器應用程式的 [監視] 區段中選取 [記錄]

顯示在何處尋找容器應用程式記錄的螢幕擷取畫面。

在 [記錄] 窗格中,撰寫並執行查詢,以透過容器應用程式系統記錄檔尋找復原。 例如,執行類似下列的查詢來搜尋復原事件,並顯示其:

  • 時間戳記
  • 環境名稱
  • 容器應用程式名稱
  • 復原類型和原因
  • 記錄訊息
ContainerAppSystemLogs_CL
| where EventSource_s == "Resiliency"
| project TimeStamp_s, EnvironmentName_s, ContainerAppName_s, Type_s, EventSource_s, Reason_s, Log_s

按一下 [執行] 以執行查詢並檢視結果。

根據提供的查詢範例顯示復原查詢結果的螢幕擷取畫面。

復原計量

從容器應用程式的 [監視] 功能表中選取 [計量]。 在 [計量] 窗格中,選取下列篩選條件:

  • 容器應用程式名稱的範圍。
  • 標準計量計量命名空間。
  • 下拉式功能表中的復原計量。
  • 您希望結果中的資料彙總方式 (依平均值、最大值等)。
  • 持續時間 (過去 30 分鐘、過去 24 小時等)。

示範如何存取容器應用程式的復原計量篩選的螢幕擷取畫面。

例如,如果您在 test-app 範圍中將復原要求重試計量設定為平均彙總,並在 30 分鐘的時間範圍內搜尋,則結果如下所示:

此螢幕擷取畫面顯示復原的範例計量篩選結果。

了解 Azure 容器應用程式中 Dapr 元件的復原運作方式。