Antipola: Menggunakan Kembali kebijakan Kuota

Anda sedang melihat dokumentasi Apigee Edge.
Buka Dokumentasi Apigee X.
info

Apigee Edge memberikan kemampuan untuk mengonfigurasi jumlah permintaan yang diizinkan bagi Proxy API untuk periode waktu tertentu menggunakan kebijakan Kuota.

Anti-pola

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 yang berbeda dari Proxy API
  • Di endpoint target yang berbeda dari Proxy API

Kemudian penghitung kuota berkurang setiap kali dieksekusi dan kita akan mendapatkan Error pelanggaran kuota jauh lebih awal dari yang diharapkan untuk interval waktu yang ditentukan.

Mari kita gunakan contoh berikut untuk menjelaskan cara kerjanya.

Proxy API

Misalkan kita memiliki Proxy API bernama “TestTargetServerQuota”, yang mengarahkan traffic ke dua server target yang berbeda berdasarkan jalur resource. Kita juga ingin membatasi traffic API hingga 10 permintaan per menit untuk setiap server target ini. Berikut adalah tabel yang menunjukkan hal ini skenario:

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 untuk kedua server target sama, kami menetapkan kebijakan Quota tunggal bernama “Quota-Minute-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-AS”:

<!-- /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>

Dan gunakan kembali kebijakan Kuota yang sama, “Quota-Minute-Target-Server” di preflow target lainnya endpoint “Target-EU” juga:

<!-- /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 lalu lintas masuk

Misalkan 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, katakanlah setelah 32 detik.

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

Namun, pada kenyataannya, kita mendapatkan Quota violation error.

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

Dampak

Antipola ini dapat mengakibatkan ketidakcocokan ekspektasi yang mendasar, yang menyebabkan persepsi bahwa batas kuota telah habis di awal.

Praktik terbaik

  • Gunakan elemen <Class> atau <Identifier> untuk memastikan beberapa, penghitung unik dikelola dengan menentukan satu kebijakan Kuota. Mari tentukan ulang kebijakan Kuota “Quota-Minute-Target-Server” yang baru saja kami jelaskan di bagian sebelumnya dengan menggunakan header target_id sebagai <Identifier> untuk 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, misalkan jika 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 target endpoint "Target-EU".
    • Jadi, meskipun kita menggunakan kebijakan Kuota yang sama di kedua endpoint target, penghitung kuota terpisah 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 endpoint alur/target/Proxy API untuk memastikan bahwa Anda selalu mendapatkan jumlah permintaan API yang diizinkan. Sekarang, mari kita lihat contoh yang sama dengan di atas untuk melihat bagaimana kami dapat mencapai kuota yang diizinkan sebanyak 10 permintaan untuk setiap target endpoint.
    • Tentukan kebijakan Kuota terpisah, masing-masing untuk endpoint target “Target-US” dan “Target-Uni Eropa”

      Kebijakan kuota untuk Endpoint Target “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 Endpoint Target “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 ini:

      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 kita menggunakan kebijakan Kuota terpisah di endpoint target "Target-US" dan “Target-EU”, penghitung terpisah akan dipertahankan. Hal ini memastikan bahwa kita mendapatkan izin kuota 10 permintaan API per menit untuk setiap endpoint target.
  • Gunakan elemen <Class> atau <Identifier> untuk memastikan beberapa, penghitung unik dipertahankan.