Antipola: 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, terlepas dari tempat 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 akan dikurangi 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

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 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 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 Kuota "Quota-Minute-Target-Server" di pra-alur 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>

Dan gunakan kembali kebijakan Kuota yang sama "Quota-Minute-Target-Server" di pra-alur endpoint target lain "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 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 berhasil dilakukan dengan asumsi bahwa kita masih memiliki 6 permintaan API untuk endpoint target target-us 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. Dengan demikian, kita akan menghabiskan kuota 10 permintaan per menit secara kolektif, bukan untuk setiap endpoint target.

Dampak

Antipola ini dapat menyebabkan ketidakcocokan ekspektasi yang mendasar, sehingga menimbulkan persepsi bahwa batas kuota telah habis lebih awal.

Praktik terbaik

  • Gunakan elemen <Class> atau <Identifier> untuk memastikan beberapa penghitung unik dikelola 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> untuk 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, 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 endpoint target "Target-EU".
    • Jadi, meskipun 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 yang diizinkan sebanyak 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 sebesar 10 permintaan untuk setiap endpoint target.
    • Tentukan kebijakan Kuota terpisah, masing-masing untuk endpoint target "Target-US" dan "Target-EU"

      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:

      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. Hal ini memastikan bahwa kita mendapatkan kuota yang diizinkan sebesar 10 permintaan API per menit untuk setiap endpoint target.
  • Gunakan elemen <Class> atau <Identifier> untuk memastikan beberapa penghitung unik dipertahankan.