反模式:將單一目標伺服器 (MaxFailures 設為非零值) 的負載平衡

您正在查看 Apigee Edge 說明文件。
查看 Apigee X 說明文件
資訊

TargetEndpoint 設定可定義 Apigee Edge 連線至後端服務或 API 的方式。它會傳送要求,並接收來自後端服務的回應。後端服務可以是 HTTP/HTTPS 伺服器、NodeJS 或代管目標。

您可以透過下列其中一種方式叫用 TargetEndpoint 中的後端服務:

  • HTTP 或 HTTPS 伺服器的直接網址
  • 從 Edge 託管的 Node.js 指令碼的 ScriptTarget
  • HostedTarget 遷移至在代管目標環境中部署的 NodeJS
  • 目標伺服器設定

同樣地,服務呼叫政策也可用於從 API Proxy 流程呼叫任何外部服務。這項政策支援直接在政策本身或使用 TargetServer 設定來定義 HTTP/HTTPS 目標網址。

目標伺服器設定

TargetServer 設定可將目標端點網址或服務呼叫政策中的具體端點網址分離。TargetServer 由名稱參照,而非 TargetEndpoint 中的網址。TargetServer 設定會包含後端服務的主機名稱、通訊埠編號和其他詳細資料。

以下是 TargetServer 設定範例:

<TargetServer name="target1">
  <Host>www.mybackendservice.com</Host>
  <Port>80</Port>
  <IsEnabled>true</IsEnabled>
</TargetServer>

TargetServer 可讓您為各個環境提供不同設定。您可以使用 LoadBalancer,以一或多個命名的 TargetServers 設定 TargetEndpoint/Service 呼叫政策。負載平衡內建支援提高 API 的可用性,並在已設定的後端伺服器執行個體之間進行容錯移轉。

以下是使用 TargetServers 的 TargetEndpoint 設定範例:

<TargetEndpoint name="default">
    <HTTPTargetConnection>>
      <LoadBalancer>
        <Server name="target1"/>
      <Server name="target2"/>
      </LoadBalancer>
    </HTTPTargetConnection>
</TargetEndpoint>

MaxFailures

MaxFailures 設定指定對目標伺服器的要求失敗次數上限。在這個值之後,目標伺服器會標示為下架,並從所有後續要求的輪替作業中移除。

已指定 MaxFailures 的設定範例:

<TargetEndpoint name="default">
    <HTTPTargetConnection>
      <LoadBalancer>
        <Server name="target1"/>
       <Server name="target2"/>
       <MaxFailures>5</MaxFailures>
      </LoadBalancer>
    </HTTPTargetConnection>
</TargetEndpoint>

在上述範例中,如果「target1」有五個連續要求都失敗,則「target1」就會從輪播中移除,所有後續要求也只會傳送至 target2。

反模式

我們不建議在 TargetEndpoint 或服務呼叫政策的 LoadBalancer 設定中使用單一 TargetServer,並將 MaxFailures 設為非零值,因為這會造成不利影響。

請參考以下範例設定,將名為「target1」且 MaxFailures 設為 5 (非零值) 的單一 TargetServer:

<TargetEndpoint name="default">
  <HTTPTargetConnection>
      <LoadBalancer>
        <Algorithm>RoundRobin</Algorithm>
        <Server name="target1" />
        <MaxFailures>5</MaxFailures>
      </LoadBalancer>
  </HTTPTargetConnection>

如果傳送至 TargetServer「target1」的要求失敗五次 (MaxFailures 中指定的數字),系統會將 TargetServer 從旋轉作業中移除。由於沒有其他 TargetServers 無法容錯移轉,因此所有後續對 API Proxy 提出這項設定的要求都會失敗,並傳回 503 Service Unavailable 錯誤。

即使 TargetServer「target1」會回復正常狀態,而且能夠傳送成功回應,對 API Proxy 的要求仍會繼續傳回 503 錯誤。這是因為即使目標已啟動並再次執行,Edge 也不會自動將 TargetServer 移迴旋轉。如要解決這個問題,請為 Edge 重新部署 API Proxy,將 TargetServer 重新加入旋轉。

如果在服務呼叫政策中使用相同設定,則傳送至 TargetServer「target1」的要求失敗 5 次後,API 要求就會收到 500 錯誤。

影響程度

在 TargetEndpoint 或服務呼叫政策的 LoadBalancer 設定中使用單一 TargetServer,並將 MaxFailures 設為非零值,原因如下:

  • API 要求連續失敗並持續發生 503/500 錯誤 (在 MaxFailures 的要求次數失敗後),直到重新部署 API Proxy 為止。
  • 服務中斷不但較為困難,而且可能還會花更多時間診斷這個問題的原因 (您不需要事先瞭解這種反模式)。

最佳做法

  1. LoadBalancer 設定中擁有多個 TargetServer,以提高可用性。
  2. MaxFailures 設為非零的值時,一律定義健康監控器。如果失敗次數達到 MaxFailures 中指定的數量,目標伺服器就會從輪替中移除。使用 HealthMonitor 可確保 TargetServer 在目標伺服器再次可用時,就會退回輪替,也就是說,您不需要重新部署 Proxy

    為確保健康狀態檢查執行的通訊埠編號與 Edge 連線至目標伺服器所使用的通訊埠編號相同,Apigee 建議您省略 <TCPMonitor> 下的 <Port> 子項元素,除非它與 TargetServer 通訊埠不同。根據預設,<Port> 與 TargetServer 通訊埠相同。

    HealthMonitor 的設定範例:

    <TargetEndpoint name="default">
      <HTTPTargetConnection>
        <LoadBalancer>
          <Algorithm>RoundRobin</Algorithm>
          <Server name="target1" />
          <Server name="target2" />
          <MaxFailures>5</MaxFailures>
        </LoadBalancer>
        <Path>/test</Path>
        <HealthMonitor>
          <IsEnabled>true</IsEnabled>
          <IntervalInSec>5</IntervalInSec>
          <TCPMonitor>
            <ConnectTimeoutInSec>10</ConnectTimeoutInSec>
          </TCPMonitor>
        </HealthMonitor>
      </HTTPTargetConnection>
    </TargetEndpoint>
    
  3. 如果有限制使只有一個 TargetServer,且未使用 HealthMonitor,請勿在 LoadBalancer 設定中指定 MaxFailures

    MaxFailures 的預設值為 0。這表示 Edge 一律會嘗試針對每個要求連線至目標,且絕對不會將目標伺服器從旋轉作業中移除。

其他資訊