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

查看 Apigee Edge 說明文件。
前往 Apigee X說明文件
資訊

TargetEndpoint 設定會定義 Apigee Edge 連線至伺服器的方式 後端服務或 API會傳送要求並接收傳入/傳出的回應 將流量導向至後端服務後端服務可以是 HTTP/HTTPS 伺服器、NodeJS 或代管目標。

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

  • 指向 HTTP 或 HTTPS 伺服器的直接網址
  • 將 ScriptTarget 指定為 Edge 代管的 Node.js 指令碼
  • 將 HostedTarget 部署至託管目標環境上的 NodeJS
  • 目標伺服器設定

同樣地,服務呼叫政策可用來呼叫任何外部服務 產生的結果這項政策支援定義 HTTP/HTTPS 目標網址 或是使用 TargetServer 設定。

目標伺服器設定

TargetServer 設定可將具體端點網址從 目標端點設定或服務呼叫政策中。TargetServer ,而不是 TargetEndpoint 中的 URL。TargetServer 設定 會有後端服務的主機名稱、通訊埠編號及其他詳細資料

以下是 TargetServer 設定範例:

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

TargetServer 可讓您針對各個環境使用不同的設定。 目標端點/服務呼叫政策可以使用一或多個已命名的 TargetServers 設定 您將使用 LoadBalancer 服務內建的負載平衡支援功能可提升可用性 並在已設定的後端伺服器執行個體之間進行容錯移轉

以下是使用 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。

反模式

將單一 TargetServerLoadBalancerMaxFailures」將目標端點或服務呼叫政策設為 不建議使用非零的值,因為這可能會帶來不良影響。

請參考下列含有單一 TargetServer 的範例設定 名稱為「target1」其中 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 錯誤。這是因為 Edge 不會自動將 TargetServer 即使在目標恢復執行後 也已回復至旋轉狀態如要解決這個問題 必須重新部署 API Proxy,Edge 才能 將目標伺服器移回輪播設定。

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

影響

在以下應用程式的 LoadBalancer 設定中使用單一 TargetServer 如果目標端點或服務呼叫政策的 MaxFailures 設為非零值,就會導致:

  • API 要求持續失敗且持續 503/500 錯誤 (達到 MaxFailures 的失敗次數後),直到重新部署 API Proxy 為止。
  • 服務中斷時間較長,因為這會較難,且可能需要更多時間診斷這個問題的起因 (如果沒有事先瞭解此反模式的知識)。

最佳做法

  1. LoadBalancer 設定中有多個 TargetServer,藉此提高可用性。
  2. MaxFailures一律定義健康監控器 設為非零的值。系統會從輪播中移除目標伺服器 失敗次數達到 MaxFailures 中指定的數量。 執行健康監控可以確保 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 一律會 會試著為每個要求連線至目標,而且絕對不會將目標伺服器從輪替中移除。

延伸閱讀