Antipattern: Load Balance dengan satu server target dengan MaxFailures ditetapkan ke nilai bukan nol

Anda sedang melihat dokumentasi Apigee dan Apigee Hybrid.
Lihat dokumentasi Apigee Edge.

Konfigurasi TargetEndpoint menentukan cara Apigee terhubung ke layanan backend atau API. Fungsi ini mengirim permintaan dan menerima respons ke/dari layanan backend. Layanan backend dapat berupa server HTTP/HTTPS atau NodeJS.

Layanan backend di TargetEndpoint dapat dipanggil dengan salah satu cara berikut:

  • Mengarahkan URL ke server HTTP atau HTTPS
  • Konfigurasi TargetServer

Demikian juga, kebijakan ServiceCallout dapat digunakan untuk melakukan panggilan ke layanan eksternal dari alur Proxy API. Kebijakan ini mendukung penentuan URL target HTTP/HTTPS baik secara langsung dalam kebijakan itu sendiri atau menggunakan konfigurasi TargetServer.

Konfigurasi TargetServer

Konfigurasi TargetServer memisahkan URL endpoint konkret dari konfigurasi TargetEndpoint atau dalam kebijakan Service Callout. TargetServer direferensikan melalui nama, bukan URL di TargetEndpoint. Konfigurasi TargetServer akan memiliki nama host layanan backend, nomor port, dan detail lainnya.

Berikut adalah contoh konfigurasi TargetServer:

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

TargetServer memungkinkan Anda memiliki konfigurasi yang berbeda untuk setiap lingkungan. Kebijakan TargetEndpoint/Info Layanan dapat dikonfigurasi dengan satu atau beberapa TargetServers bernama menggunakan LoadBalancer. Dukungan bawaan untuk load balancing meningkatkan ketersediaan API dan failover di antara instance server backend yang dikonfigurasi.

Berikut adalah contoh konfigurasi TargetEndpoint yang menggunakan TargetServers:

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

MaxFailures

Konfigurasi MaxFailures menetapkan jumlah maksimum kegagalan permintaan ke server target, yang setelahnya server target akan ditandai sebagai tidak aktif dan dihapus dari rotasi untuk semua permintaan berikutnya.

Contoh konfigurasi dengan MaxFailures yang ditentukan:

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

Dalam contoh di atas, jika lima permintaan berturut-turut gagal untuk "target1", maka "target1" akan dihapus dari rotasi dan semua permintaan berikutnya hanya akan dikirim ke target2.

Antipola

Menetapkan TargetServer tunggal di konfigurasi LoadBalancer pada kebijakan TargetEndpoint atau Info Layanan dengan MaxFailures yang ditetapkan ke nilai selain nol tidak direkomendasikan karena dapat berdampak negatif.

Pertimbangkan contoh konfigurasi berikut yang memiliki satu TargetServer bernama "target1" dengan MaxFailures yang ditetapkan ke 5 (nilai bukan nol):

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

Jika permintaan ke TargetServer "target1" gagal lima kali (angka yang ditentukan dalam MaxFailures), TargetServer akan dihapus dari rotasi. Karena tidak ada TargetServers lain untuk digagalkan, semua permintaan berikutnya ke Proxy API yang memiliki konfigurasi ini akan gagal dengan error 503 Service Unavailable.

Meskipun TargetServer "target1" kembali ke status normal dan mampu mengirim respons yang berhasil, permintaan ke Proxy API akan terus menampilkan error 503. Hal ini karena Apigee tidak otomatis melakukan rotasi kembali TargetServer bahkan setelah target aktif dan berjalan lagi. Untuk mengatasi masalah ini, Proxy API harus di-deploy ulang agar Apigee dapat mengembalikan TargetServer ke rotasi.

Jika konfigurasi yang sama digunakan dalam kebijakan Info Layanan, permintaan API akan mendapatkan Error 500 setelah permintaan ke TargetServer "target1" gagal 5 kali.

Dampak

Menggunakan satu TargetServer di konfigurasi LoadBalancer kebijakan TargetEndpoint atau Service Callout dengan MaxFailures ditetapkan ke nilai bukan nol menyebabkan:

  • Permintaan API gagal dengan Error 503/500 secara terus-menerus (setelah permintaan gagal untuk frekuensi MaxFailures berkali-kali) hingga Proxy API di-deploy ulang.
  • Pemadaman layanan yang lebih lama karena rumit dan memerlukan waktu yang lebih lama untuk mendiagnosis penyebab masalah ini (tanpa pengetahuan sebelumnya tentang antipola ini).

Praktik Terbaik

  1. Memiliki lebih dari satu TargetServer dalam konfigurasi LoadBalancer untuk ketersediaan yang lebih tinggi.
  2. Selalu tentukan Health Monitor saat MaxFailures ditetapkan ke nilai bukan nol. Server target akan dihapus dari rotasi jika jumlah kegagalan mencapai jumlah yang ditentukan dalam MaxFailures. HealthMonitor memastikan bahwa TargetServer dialihkan kembali ke rotasi segera saat server target tersedia kembali, artinya tidak perlu men-deploy ulang proxy.

    Untuk memastikan health check dilakukan pada nomor port yang sama dengan yang digunakan Apigee untuk terhubung ke server target, Apigee merekomendasikan agar Anda menghilangkan elemen turunan <Port> pada <TCPMonitor>, kecuali jika berbeda dengan port TargetServer. Secara default, <Port> sama dengan port TargetServer.

    Contoh konfigurasi dengan 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. Jika ada beberapa batasan sehingga hanya satu TargetServer dan jika HealthMonitor tidak digunakan, jangan tentukan MaxFailures dalam konfigurasi LoadBalancer.

    Nilai default MaxFailures adalah 0. Ini berarti bahwa Apigee selalu mencoba terhubung ke target untuk setiap permintaan dan tidak pernah menghapus server target dari rotasi.

Bacaan lebih lanjut