Antipattern: Kota politikasını yeniden kullanma

Apigee Edge belgelerini görüntülüyorsunuz.
. Git: Apigee X belgeleri.
bilgi

Apigee Edge, aşağıdaki işlemler için API Proxy'sine izin verilen istek sayısını yapılandırmanıza olanak tanır: Kota politikası kullanılarak belirli bir süre boyunca kullanılabilir.

Antipattern

Yeniden kullanılan Kota politikası her yürütüldüğünde, kullanıldığı alandan bağımsız olarak kota sayacında düşüşe neden olur. Bu durum Kota politikası aşağıdaki alanlarda yeniden kullanılırsa geçerlidir:

  • Bir API Proxy'sinin aynı veya farklı akışlarında
  • Bir API Proxy'sinin farklı hedef uç noktalarında

Kota politikası her yürütüldüğünde kota sayacı azalır ve kota ihlali hatalarını, belirtilen zaman aralığı için beklenenden çok daha erken alırız.

Bunun işleyiş şeklini açıklamak için aşağıdaki örneği kullanalım.

API Proxy'si

Trafiği iki sunucuya yönlendiren "TestTargetServerQuota" adlı bir API Proxy'mizin olduğunu varsayalım. kaynak yoluna göre farklı hedef sunucular belirleyin. API trafiğini bu hedef sunucuların her biri için dakikada 10 istekle sınırlandırmak istiyoruz. Bunu gösteren tablo senaryo:

Kaynak Yolu Hedef Sunucu Kota
/target-us target-US.somedomain.com Dakikada 10 istek
/target-eu target-EU.somedomain.com Dakikada 10 istek

Kota politikası

Trafik kotası her iki hedef sunucu için de aynı olduğundan tek bir Kota politikası tanımlıyoruz. aşağıdaki gibi “Quota-Minute-Target-Server” adını görürsünüz:

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

Hedef uç noktaları

Hedef uç noktanın ön akışında Kota politikasını "Quota-Minute-Target-Server" şeklinde kullanalım. "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>

Ayrıca, "Quota-Minute-Target-Server" adlı kota politikasını diğer hedefin ön akışında yeniden kullanın. "Target-EU" uç noktası da içerir:

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

Gelen trafik kalıbı

Bu API Proxy'si için, ilk 30 saniye içinde toplam 10 API isteği aldığımızı varsayalım. şu kalıbı kullanın:

Kaynak Yolu /target-us /target-eu Tümü
İstek Sayısı 4 6 10

Biraz sonra, kaynak yolunun /target-us olduğu 11. API isteğini alıyoruz. 32 saniye sonra olduğunu varsayalım.

target-us hedef uç noktası için kota sınırları dahilinde 6 API isteğimizin daha olduğunu varsayıp isteğin başarılı bir şekilde işlenmesini bekliyoruz.

Ancak, işlemin devamında bir Quota violation error hatası alıyoruz.

Neden: Hedef uç noktalarında aynı Kota politikasını kullandığımızdan, her iki hedef uç noktaya ulaşan API isteklerini izlemek için tek bir kota sayacı kullanıldı. Bu nedenle, dakikada 10 isteğe izin veren kotayı ayrı hedef uç noktaları yerine her iki hedef uç noktası için de kullanarak tükettik.

Etkiler

Bu antipattern, kota sınırlarının olması gerekenden daha erken aşıldığı algısı oluşturarak beklentilerin karşılanmamasına neden olabilir.

En iyi uygulama

  • Tek bir Kota politikası tanımlayarak birden fazla benzersiz sayacın sağlanması için <Class> veya <Identifier> öğelerini kullanın. Kota politikasını yeniden tanımlayalım. Önceki bölümde başlıktaki başlığı kullanarak açıkladığımız "Quota-Minute-Target-Server" Aşağıda gösterildiği gibi, <Identifier> olarak target_id:
    <!-- /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>
    
    • Bu Kota politikasını hem "Target-US" hem de hedef uç noktalarında kullanmaya devam edeceğiz. "Target-EU" olarak ayarlayın.
    • Şimdi de target_id başlığının değeri "US" ise isteklerin "Target-US" hedef uç noktası.
    • Benzer şekilde, target_id başlığında "EU" değeri varsa istekler hedefe yönlendirilir "Target-EU" uç noktası.
    • Böylece her iki hedef uç noktasında da aynı Kota politikasını kullansak bile <Identifier> değerine göre ayrı kota sayaçları sağlanır.
    • Bu nedenle, <Identifier> öğesini kullanarak hedef uç noktalarının her birinin izin verilen 10 isteklik kotayı almasını sağlayabiliriz.
  • İzin verilen API isteği sayısını tutarlı olarak almak için akışların/hedef uç noktalarının/API Proxy'lerinin her birinde ayrı Kota politikaları kullanın. Şimdi Google Ads API'sinde kullanılan 10 isteklik izin verilen kotaya nasıl ulaşabileceğimizi görmek için yukarıdaki bölüme bakın. uç noktalar.
    • Her biri "Target-US" ve hedef uç noktaları için birer tane olmak üzere ayrı Kota politikaları tanımlayın. "Hedef AB"

      "Target-US" Hedef Uç Noktası için Kota politikası:

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

      "Target-EU" Hedef Uç Noktası için Kota politikası:

      <!-- /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>
      
    • Hedef uç noktalarının tanımına ilişkin kota politikasını aşağıda gösterildiği gibi kullanın:

      Hedef Uç Noktası "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-EU" Hedef Uç Noktası:

      <!-- /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>
      
    • "Target-US" ve "Target-EU" bir sayaç ayrı bir sayaç olacaktır. Bu, hedef uç noktaların her biri için dakikada 10 API isteğine izin veren kotayı alabilmemizi sağlar.
  • Birden fazla benzersiz sayacın sağlandığından emin olmak için <Class> veya <Identifier> öğelerini kullanın.