Antipattern: Kota politikasını yeniden kullanma

Apigee Edge belgelerini görüntülüyorsunuz.
Apigee X belgelerine gidin.
bilgi

Apigee Edge, Kota politikasını kullanarak belirli bir süre boyunca bir API Proxy'sine izin verilen istek sayısını yapılandırmanıza olanak tanır.

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
  • 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.

Bu sürecin işleyiş şeklini açıklamak için aşağıdaki örneği kullanalım.

API Proxy'si

Trafiği kaynak yoluna göre iki farklı hedef sunucuya yönlendiren "TestTargetServerQuota" adlı bir API Proxy'miz olduğunu varsayalım. API trafiğini bu hedef sunucuların her biri için dakikada 10 istekle sınırlandırmak istiyoruz. Bu senaryoyu açıklayan tabloya bakalım:

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, aşağıda gösterildiği gibi "Quota-Minute-Target-Server" adlı tek bir Kota politikası tanımları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ı

Şimdi, "Target-US" hedef uç noktasının ön akışında "Quota-Minute-Target-Server" Kota politikasını kullanalım:

<!-- /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ı diğer hedef uç noktası "Target-EU"un ön akışında aynı Kota politikasını da tekrar kullanabilirsiniz:

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

Aşağıdaki kalıpta, ilk 30 saniye içinde bu API Proxy'si için toplam 10 API isteği aldığımızı varsayalım:

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

Kısa bir süre sonra, kaynak yolu /target-us olan 11. API isteğini alıyoruz. Diyelim ki 32 saniye sonra.

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. Önceki bölümde açıkladığımız "Quota-Minute-Target-Server" Kota politikasını aşağıda gösterildiği gibi <Identifier> olarak target_id başlığını kullanarak yeniden tanımlayalım:
    <!-- /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ı daha önce olduğu gibi hem "Target-US" hem de "Target-EU" hedef uç noktalarında kullanmaya devam edeceğiz.
    • Şimdi, target_id başlığında "US" değeri varsa isteklerin "Target-US" hedef uç noktasına yönlendirildiğini varsayalım.
    • Benzer şekilde, target_id başlığında "EU" değeri olan istekler de "Target-EU" hedef uç noktasına yönlendirilir.
    • 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 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, hedef uç noktalarının her biri için izin verilen 10 isteklik kotaya nasıl ulaşabileceğimizi görmek için yukarıdaki bölümde kullanılan örneği inceleyelim.
    • "Target-US" ve "Target-EU" hedef uç noktaları için birer tane olmak üzere ayrı Kota politikaları tanımlayın

      "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ında ilgili 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>
      

      Hedef Uç Noktası "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>
      
    • "Target-US" ve "Target-EU" hedef uç noktalarında ayrı Kota politikası kullandığımız için ayrı bir sayaç sağlanacaktı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.