Antipola: 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 atau API backend. Metode 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:

  • URL langsung ke server HTTP atau HTTPS
  • Konfigurasi TargetServer

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

Konfigurasi TargetServer

Konfigurasi TargetServer memisahkan URL endpoint konkret dari konfigurasi TargetEndpoint atau dalam kebijakan Info Layanan. TargetServer direferensikan oleh 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/Service Callout dapat dikonfigurasi dengan satu atau beberapa TargetServer 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 menggunakan TargetServers:

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

MaxFailures

Konfigurasi MaxFailures menentukan jumlah maksimum kegagalan permintaan ke server target, setelah itu server target akan ditandai sebagai nonaktif 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>

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

Antipola

Memiliki satu TargetServer dalam konfigurasi LoadBalancer dari kebijakan TargetEndpoint atau Service Callout dengan MaxFailures yang ditetapkan ke nilai non-nol tidak direkomendasikan karena dapat memiliki implikasi yang merugikan.

Pertimbangkan contoh konfigurasi berikut yang memiliki satu TargetServer bernama "target1" dengan MaxFailures 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 (jumlah yang ditentukan di MaxFailures), TargetServer akan dihapus dari rotasi. Karena tidak ada TargetServer lain yang akan di-failover, 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 menempatkan TargetServer kembali dalam rotasi meskipun setelah target aktif dan berjalan lagi. Untuk mengatasi masalah ini, Proxy API harus di-deploy ulang agar Apigee dapat memasukkan TargetServer kembali 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 dalam konfigurasi LoadBalancer dari kebijakan TargetEndpoint atau Service Callout dengan MaxFailures yang ditetapkan ke nilai non-nol akan menyebabkan:

  • Permintaan API akan gagal dengan Error 503/500 secara terus-menerus (setelah permintaan gagal sebanyak MaxFailures) hingga Proxy API di-deploy ulang.
  • Pemadaman yang lebih lama karena sulit dan memerlukan lebih banyak waktu 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 jika MaxFailures ditetapkan ke nilai selain nol. Server target akan dihapus dari rotasi saat jumlah kegagalan mencapai jumlah yang ditentukan dalam MaxFailures. Dengan memiliki HealthMonitor, TargetServer akan dimasukkan kembali ke dalam rotasi begitu server target tersedia lagi, yang berarti tidak perlu men-deploy ulang proxy.

    Untuk memastikan bahwa health check dilakukan pada nomor port yang sama dengan yang digunakan Apigee untuk terhubung ke server target, Apigee merekomendasikan agar Anda menghapus elemen turunan <Port> di bagian<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 ada satu TargetServer dan jika HealthMonitor tidak digunakan, jangan tentukan MaxFailures dalam konfigurasi LoadBalancer.

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

Bacaan lebih lanjut