Antipattern: MaxFailures değeri sıfır olmayan tek bir hedef sunucuyla Yük Dengeleme

Apigee Edge belgelerini görüntülüyorsunuz.
Apigee X belgelerine gidin.
bilgi

TargetEndpoint yapılandırması, Apigee Edge'in bir arka uç hizmetine veya API'ye bağlanma şeklini tanımlar. İstekleri gönderir ve yanıtları arka uç hizmetine gönderir. Arka uç hizmeti HTTP/HTTPS sunucusu, NodeJS veya Barındırılan Hedef olabilir.

TargetEndpoint'teki arka uç hizmeti aşağıdaki yöntemlerden biriyle çağrılabilir:

  • URL'yi HTTP veya HTTPS sunucusuna yönlendirme
  • Edge tarafından barındırılan bir Node.js komut dosyasına ScriptTarget öğesi
  • Barındırılan Hedef Ortamında dağıtılan NodeJS'ye Barındırılan Target
  • TargetServer yapılandırması

Benzer şekilde, Hizmet Çağrısı politikası da API Proxy akışından herhangi bir harici hizmete çağrı yapmak için kullanılabilir. Bu politika, HTTP/HTTPS hedef URL'lerinin doğrudan politikanın kendisinde veya bir TargetServer yapılandırması kullanılarak tanımlanmasını destekler.

TargetServer yapılandırması

TargetServer yapılandırması, somut uç nokta URL'lerini TargetEndpoint yapılandırmalarından veya Hizmet Çağrı Politikası politikalarından ayırır. Bir TargetServer'a, TargetEndpoint'te URL yerine bir adla başvurulur. TargetServer yapılandırmasında arka uç hizmetinin ana makine adı, bağlantı noktası numarası ve diğer ayrıntılar bulunur.

Aşağıda örnek bir TargetServer yapılandırması verilmiştir:

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

TargetServer, her ortam için farklı yapılandırmalara sahip olmanıza olanak tanır. TargetEndpoint/Hizmet Çağrısı politikası, LoadBalancer kullanılarak bir veya daha fazla adlı TargetServers ile yapılandırılabilir. Yük dengeleme için yerleşik destek, API'lerin kullanılabilirliğini ve yapılandırılmış arka uç sunucu örnekleri arasında yük devretmeyi iyileştirir.

Aşağıda, TargetServers'ın kullanıldığı örnek bir TargetEndpoint yapılandırması verilmiştir:

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

MaxFailures

MaxFailures yapılandırması, hedef sunucuda yapılan maksimum istek hatası sayısını belirtir. Bu işlemden sonra hedef sunucu kapalı olarak işaretlenecek ve sonraki tüm istekler için rotasyondan kaldırılacaktır.

MaxFailures öğesinin belirtildiği örnek bir yapılandırma:

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

Yukarıdaki örnekte, "target1" için art arda beş istek başarısız olursa "target1" rotasyondan kaldırılır ve sonraki tüm istekler yalnızca target2'ye gönderilir.

Antipattern

TargetEndpoint veya Hizmet Çağrısı politikasının LoadBalancer yapılandırmasında MaxFailures ile sıfır olmayan bir değere ayarlanmış tek TargetServer'ın olması, olumsuz sonuçlar doğurabileceğinden önerilmez.

MaxFailures değeri 5 (sıfır olmayan) olarak ayarlanmış, "target1" adlı tek bir TargetServer'ın bulunduğu aşağıdaki örnek yapılandırmayı düşünün:

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

TargetServer "target1" için yapılan istekler beş kez (sayı MaxFailures içinde belirtilmiştir) başarısız olursa TargetServer rotasyondan kaldırılır. Yüklenecek başka TargetServer'lar olmadığından, bu yapılandırmaya sahip olan API Proxy'sine yapılacak sonraki tüm istekler 503 Service Unavailable hatasıyla başarısız olur.

TargetServer "target1" normal durumuna geri dönse ve başarılı yanıtlar gönderebilecek olsa bile, API Proxy'sine yapılan istekler 503 hataları döndürmeye devam eder. Bunun nedeni, hedef yeniden çalışır hale geldikten sonra bile Edge'in TargetServer'ı otomatik olarak rotasyona almamasıdır. Bu sorunu çözmek amacıyla Edge'in TargetServer'ı tekrar eski haline getirmesi için API Proxy'sinin yeniden dağıtılması gerekir.

Hizmet Çağrı Politikası'nda aynı yapılandırma kullanılırsa TargetServer "target1" için yapılan istekler 5 kez başarısız olduktan sonra API istekleri 500 Hatası alır.

Etki

TargetEndpoint veya Hizmet Çağrı Politikası'nın LoadBalancer yapılandırmasında MaxFailures sıfır olmayan bir değere ayarlanmış tek bir TargetServer'ın kullanılması:

  • API Proxy'si yeniden dağıtılana kadar API İstekleri, 503/500 Hatayla sürekli olarak başarısız olur (İstekler birkaç kez başarısız olduktan sonra).
  • Daha uzun süreli kesintiler karmaşıktır ve bu sorunun nedenini teşhis etmek daha fazla zaman alabilir (bu antipattern hakkında önceden bilgi sahibi olmadan).

En İyi Uygulama

  1. Daha yüksek kullanılabilirlik için LoadBalancer yapılandırmasında birden fazla TargetServer'a sahip olun.
  2. MaxFailures sıfır dışında bir değere ayarlandığında her zaman bir Durum İzleme tanımlayın. Hata sayısı MaxFailures politikasında belirtilen sayıya ulaştığında hedef sunucu rotasyondan çıkarılır. HealthMonitor'a sahip olmak, hedef sunucu tekrar kullanılabilir hale gelir gelmez TargetServer'ın tekrar rotasyona alınmasını sağlar. Bu da proxy'nin yeniden dağıtılmasına gerek olmadığı anlamına gelir.

    Durum denetiminin, Edge'ın hedef sunuculara bağlanmak için kullandığı bağlantı noktası numarasında yapıldığından emin olmak amacıyla Apigee, TargetServer bağlantı noktasından farklı olmadığı sürece <TCPMonitor> altındaki <Port> alt öğesini atlamanızı önerir. <Port> varsayılan olarak TargetServer bağlantı noktasıyla aynıdır.

    HealthMonitor ile örnek yapılandırma:

    <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. Yalnızca bir TargetServer'ın atanmasına neden olacak bazı kısıtlamalar varsa ve HealthMonitor kullanılmıyorsa LoadBalancer yapılandırmasında MaxFailures belirtmeyin.

    Varsayılan MaxFailures değeri 0'dır. Bu, Edge'in her zaman her istek için hedefe bağlanmaya çalıştığı ve hedef sunucuyu rotasyondan hiçbir zaman kaldırmadığı anlamına gelir.

Daha fazla bilgi