Antipattern: Menggunakan kembali kebijakan Kuota

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

Apigee menyediakan kemampuan untuk mengonfigurasi jumlah permintaan yang diizinkan untuk Proxy API selama periode waktu tertentu menggunakan kebijakan Kuota.

Antipola

Jika Kebijakan kuota digunakan kembali, penghitung kuota akan dikurangi setiap kali kebijakan Kuota dijalankan, di mana pun kebijakan tersebut digunakan. Artinya, jika kebijakan Kuota digunakan kembali:

  • Dalam alur yang sama atau alur proxy API yang berbeda
  • Di endpoint target yang berbeda dari proxy API

Kemudian penghitung kuota dikurangi setiap kali dijalankan dan kita akan mendapati error Pelanggaran kuota lebih awal dari yang diharapkan untuk interval waktu yang ditentukan.

Mari kita gunakan contoh berikut untuk menjelaskan cara kerjanya.

Proxy API

Misalnya, kita memiliki proxy API bernama "TestTargetServerQuota", yang mengarahkan traffic ke dua server target yang berbeda berdasarkan jalur resource. Selain itu, kami ingin membatasi traffic API menjadi 10 permintaan per menit untuk setiap server target ini. Berikut adalah tabel yang menggambarkan skenario ini:

Jalur Resource Server Target Kuota
/target-us target-US.somedomain.com 10 permintaan per menit
/target-eu target-EU.somedomain.com 10 permintaan per menit

Kebijakan kuota

Karena kuota traffic sama untuk kedua server target, kami menentukan kebijakan Kuota tunggal dengan nama "Kuota-Menit-Target-Server" seperti yang ditunjukkan di bawah ini:

<!-- /antipatterns/examples/1-8.xml -->
<Quota name="Quota-Minute-Target-Server">
  <Interval>1</Interval>
  <TimeUnit>minute</TimeUnit>
  <Distributed>true</Distributed>
  <Allow count="10"/>
</Quota>

Endpoint target

Mari kita gunakan kebijakan Kuota "Quota-Minute-Target-Server" di preflow endpoint target "Target-US":

<!-- /antipatterns/examples/1-9.xml -->
<TargetEndpoint name="Target-US">
  <PreFlow name="PreFlow">
    <Request>
      <Step>
        <Name>Quota-Minute-Target-Server</Name>
      </Step>
    </Request>
  </PreFlow>
  <HTTPTargetConnection>
    <URL>http://target-us.somedomain.com</URL>
  </HTTPTargetConnection>
</TargetEndpoint>

Selain itu, gunakan kembali kebijakan Kuota "Quota-Minute-Target-Server" yang sama di preflow juga endpoint target lainnya "Target-EU":

<!-- /antipatterns/examples/1-10.xml -->
<TargetEndpoint name="Target-EU">
  <PreFlow name="PreFlow">
    <Request>
      <Step>
        <Name>Quota-Minute-Target-Server</Name>
      </Step>
    </Request>
  <Response/>
  </PreFlow>
  <HTTPTargetConnection>
    <URL>http://target-us.somedomain.com</URL>
  </HTTPTargetConnection>
</TargetEndpoint>

Pola traffic masuk

Misalnya, kita mendapatkan total 10 permintaan API untuk proxy API ini dalam 30 detik pertama dalam pola berikut:

Jalur Resource /target-us /target-eu Semua
# Permintaan 4 6 10

Beberapa saat kemudian, kita mendapatkan permintaan API ke-11 dengan jalur resource sebagai /target-us, misalnya setelah 32 detik.

Kami berharap permintaan akan berhasil dengan asumsi bahwa kami masih memiliki 6 permintaan API untuk endpoint target-us target sesuai kuota yang diizinkan.

Namun, pada kenyataannya, kita mendapatkan Quota violation error.

Alasan: Karena kita menggunakan kebijakan Kuota yang sama di kedua endpoint target, satu penghitung kuota digunakan untuk melacak permintaan API yang mencapai kedua endpoint target. Oleh karena itu, kami menghabiskan kuota 10 permintaan per menit secara kolektif, bukan untuk endpoint target individual.

Dampak

Anti-pola ini dapat mengakibatkan ketidakcocokan mendasar dengan ekspektasi, yang menyebabkan persepsi bahwa batas kuota telah habis sebelumnya.

Praktik terbaik

  • Gunakan elemen <Class> atau <Identifier> untuk memastikan beberapa penghitung unik dipertahankan dengan menentukan satu Kebijakan kuota. Mari kita tentukan ulang kebijakan Kuota "Quota-Minute-Target-Server" yang baru saja kita jelaskan di bagian sebelumnya, dengan menggunakan header target_id sebagai <Identifier> seperti yang ditunjukkan di bawah ini:
    <!-- /antipatterns/examples/1-11.xml -->
    <Quota name="Quota-Minute-Target-Server">
      <Interval>1</Interval>
      <TimeUnit>minute</TimeUnit>
      <Allow count="10"/>
      <Identifier ref="request.header.target_id"/>
      <Distributed>true</Distributed>
    </Quota>
    
    • Kami akan terus menggunakan kebijakan Kuota ini di endpoint target "Target-US" dan "Target-EU" seperti sebelumnya.
    • Sekarang, misalnya header target_id memiliki nilai "US", permintaan akan dirutekan ke endpoint target "Target-US".
    • Demikian pula, jika header target_id memiliki nilai "EU", permintaan akan dirutekan ke endpoint target "Target-EU".
    • Jadi, meskipun jika kita menggunakan kebijakan Kuota yang sama di kedua endpoint target, penghitung kuota terpisah akan dipertahankan berdasarkan nilai <Identifier>.
    • Oleh karena itu, dengan menggunakan elemen <Identifier>, kita dapat memastikan bahwa setiap endpoint target mendapatkan kuota 10 permintaan yang diizinkan.
  • Gunakan kebijakan Kuota terpisah di setiap alur/endpoint target/Proxy API untuk memastikan Anda selalu mendapatkan jumlah permintaan API yang diizinkan. Sekarang mari kita lihat contoh yang sama yang digunakan di bagian di atas untuk mengetahui cara mencapai kuota yang diizinkan sebanyak 10 permintaan untuk setiap endpoint target.
    • Tentukan kebijakan Kuota terpisah, masing-masing untuk endpoint target "Target-US" dan "Target-EU"

      Kebijakan kuota untuk Target Endpoint "Target-US":

      <!-- /antipatterns/examples/1-12.xml -->
      <Quota name="Quota-Minute-Target-Server-US">
        <Interval>1</Interval>
        <TimeUnit>minute</TimeUnit>
        <Distributed>true</Distributed>
        <Allow count="10"/>
      </Quota>
      

      Kebijakan kuota untuk Target Endpoint "Target-EU":

      <!-- /antipatterns/examples/1-13.xml -->
      <Quota name="Quota-Minute-Target-Server-EU">
        <Interval>1</Interval>
        <TimeUnit>minute</TimeUnit>
        <Distributed>true</Distributed>
        <Allow count="10"/>
      </Quota>
      
    • Gunakan kebijakan kuota masing-masing dalam definisi endpoint target seperti yang ditunjukkan di bawah:

      Endpoint Target "Target-US":

      <!-- /antipatterns/examples/1-14.xml -->
      <TargetEndpoint name="Target-US">
        <PreFlow name="PreFlow">
          <Request>
            <Step>
              <Name>Quota-Minute-Target-Server-US</Name>
            </Step>
          </Request>
          <Response/>
        </PreFlow>
        <HTTPTargetConnection>
          <URL>http://target-us.somedomain.com</URL>
        </HTTPTargetConnection>
      </TargetEndpoint>
      

      Endpoint Target "Target-EU":

      <!-- /antipatterns/examples/1-15.xml -->
      <TargetEndpoint name="Target-EU">
        <PreFlow name="PreFlow">
          <Request>
            <Step>
              <Name>Quota-Minute-Target-Server-EU</Name>
            </Step>
          </Request>
          <Response/>
        </PreFlow>
        <HTTPTargetConnection>
          <URL>http://target-eu.somedomain.com</URL>
        </HTTPTargetConnection>
      </TargetEndpoint>
      
    • Karena kami menggunakan kebijakan Kuota terpisah di endpoint target "Target-US" dan "Target-EU", penghitung terpisah akan dipertahankan. Dengan begitu, kita mendapatkan kuota yang diizinkan sebanyak 10 permintaan API per menit untuk setiap endpoint target.
  • Gunakan elemen <Class> atau <Identifier> untuk memastikan beberapa penghitung unik dipertahankan.