Antipola: Menggunakan kembali kebijakan Kuota

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

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

Antipola

Jika Kebijakan kuota digunakan kembali, penghitung kuota akan dikurangi setiap kali Kebijakan kuota dijalankan, terlepas dari tempat penggunaannya. Artinya, jika kebijakan Kuota digunakan kembali:

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

Kemudian, penghitung kuota akan berkurang setiap kali dijalankan dan kita akan mendapatkan error pelanggaran kuota lebih awal dari yang diharapkan untuk jangka waktu tertentu.

Mari kita gunakan contoh berikut untuk menjelaskan cara kerjanya.

API Proxy

Misalnya, kita memiliki proxy API bernama "TestTargetServerQuota", yang merutekan traffic ke dua server target yang berbeda berdasarkan jalur resource. Selain itu, kita ingin membatasi traffic API hingga 10 permintaan per menit untuk setiap server target ini. Berikut 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, kita menentukan satu kebijakan Kuota bernama "Quota-Minute-Target-Server" seperti yang ditunjukkan di bawah:

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

Gunakan kembali kebijakan Kuota yang sama "Quota-Minute-Target-Server" di preflow endpoint target lainnya "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 traffic masuk

Misalkan kita mendapatkan total 10 permintaan API untuk proxy API ini dalam 30 detik pertama dengan 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.

Permintaan diharapkan berhasil dikirim dengan asumsi bahwa kita 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 kita menggunakan kebijakan Kuota yang sama di kedua endpoint target, penghitung kuota tunggal digunakan untuk melacak permintaan API yang mencapai kedua endpoint target. Dengan demikian, kita menghabiskan kuota 10 permintaan per menit secara kolektif, bukan untuk setiap endpoint target.

Dampak

Antipola ini dapat menyebabkan ketidaksesuaian ekspektasi yang mendasar, sehingga menimbulkan persepsi bahwa batas kuota habis sebelum waktunya.

Praktik terbaik

  • Gunakan elemen <Class> atau <Identifier> untuk memastikan beberapa penghitung unik dipertahankan dengan menentukan satu Kebijakan kuota. Mari kita definisikan 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:
    <!-- /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, 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 endpoint target "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 yang diizinkan, yaitu 10 permintaan.
  • Gunakan kebijakan Kuota terpisah di setiap alur/endpoint target/Proxy API untuk memastikan bahwa Anda selalu mendapatkan jumlah permintaan API yang diizinkan. Sekarang, mari kita lihat contoh yang sama yang digunakan di bagian di atas untuk melihat cara mencapai kuota yang diizinkan, yaitu 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:

      Target Endpoint "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>

      Target Endpoint "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 kuota yang diizinkan sebanyak 10 permintaan API per menit untuk setiap endpoint target.
  • Gunakan elemen <Class> atau <Identifier> untuk memastikan beberapa penghitung unik dipertahankan.