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:

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

Bunun 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 aşağıdaki tabloya göz atalı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ı

"Quota-Minute-Target-Server" adlı kota politikasını "Target-US" hedef uç noktasının ön akışında 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>

Ardından "Quota-Minute-Target-Server" adlı aynı Kota politikasını "Target-EU" hedef uç noktasının ön akışında tekrar kullanalım:

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

Ardından, 32 saniye gibi kısa bir sürenin sonunda kaynak yolu /target-us olan 11. API isteğini alıyoruz.

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. target_id başlığını <Identifier> olarak kullanıp, önceki bölümde açıkladığımız "Quota-Minute-Target-Server" Kota politikasını aşağıda gösterildiği gibi 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 olan isteklerin "Target-US" hedef uç noktasına yönlendirildiğini düşünelim.
    • 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ı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 öğrenmek için yukarıdaki bölümde kullanılan örneğe tekrar bakalım.
    • "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ı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>

      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 politikaları kullandığımızdan her hedef uç noktası 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.