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

您目前查看的是 ApigeeApigee Hybrid 說明文件。
查看 Apigee Edge 說明文件。

TargetEndpoint 設定會定義 Apigee 連線至後端服務或 API 的方式。並傳送要求及接收後端服務的回應。後端服務可以是 HTTP/HTTPS 或 NodeJS 伺服器。

您可以使用下列任一方式,在 TargetEndpoint 中叫用後端服務:

  • HTTP 或 HTTPS 伺服器的直接網址
  • TargetServer 設定

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

TargetServer 設定

TargetServer 設定會將具體端點網址從 TargetEndpoint 設定或 Service Callout 政策中分離出來。TargetServer 是由名稱參照,而非 TargetEndpoint 中的網址。TargetServer 設定會包含後端服務的主機名稱、通訊埠號碼和其他詳細資料。

以下是 TargetServer 設定範例:

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

TargetServer 可讓您為每個環境設定不同的設定。您可以使用 LoadBalancer,透過一或多個具名 TargetServer 設定 TargetEndpoint/Service Callout 政策。內建的負載平衡支援功能可提升 API 的可用性,並在已設定的後端伺服器執行個體之間進行容錯移轉。

以下是使用 TargetServer 的 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」的單一 TargetServer,且 MaxFailures 設為 5 (非零值):

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

如果對 TargetServer「target1」的要求失敗五次 (MaxFailures 中指定的次數),系統就會從輪替中移除 TargetServer。由於沒有其他 TargetServer 可供容錯移轉,後續所有對 API Proxy 提出的要求都會失敗,並顯示 503 Service Unavailable 錯誤。

即使 TargetServer「target1」恢復正常狀態,能夠傳送成功的回應,對 API Proxy 的要求仍會繼續傳回 503 錯誤。這是因為即使目標再次啟動並執行,Apigee 也不會自動將 TargetServer 放回輪替。如要解決這個問題,請重新部署 API Proxy,讓 Apigee 將 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

    為確保健康狀態檢查是在 Apigee 用來連線至目標伺服器的相同通訊埠號碼上執行,Apigee 建議您省略 <Port> 底下的 <TCPMonitor> 子元素,除非該子元素與 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。這表示 Apigee 一律會嘗試連線至每個要求的目標,且絕不會從輪替中移除目標伺服器。

延伸閱讀