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

您正在查看 ApigeeApigee Hybrid 說明文件。
查看 Apigee Edge 說明文件。

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

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

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

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

TargetServer 設定

TargetServer 設定會將具體端點網址與 TargetEndpoint 設定或服務 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 的可用性,並在已設定的後端伺服器執行個體之間進行容錯移轉。

以下是使用 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 設定中,將 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 建議您省略 <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。這表示 Apigee 會一律嘗試連線至每個要求的目標,且絕不會從輪替中移除目標伺服器。

延伸閱讀