SpikeArrest politikası

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

Edge kullanıcı arayüzündeki Spike Arrest simgesi

Spike Arrest politikası, <Rate> öğesiyle trafik artışlarına karşı koruma sağlar. Bu öğe, bir API proxy'si tarafından işlenen ve bir arka uca gönderilen isteklerin sayısını kısıtlayarak performans gecikmelerine ve kapalı kalma süresine karşı koruma sağlar.

<SpikeArrest> öğesi

Spike Arrest politikasını tanımlar.

Varsayılan Değer Aşağıdaki Varsayılan Politika sekmesini inceleyin.
Zorunlu mu? İsteğe bağlı
Tür Karmaşık nesne
Üst öğe Yok
Alt Öğeler <Identifier>
<MessageWeight>
<Rate> (Zorunlu)
<UseEffectiveCount>

Söz dizimi

<SpikeArrest> öğesi şu söz dizimini kullanır:

<SpikeArrest
  continueOnError="[false|true]"
  enabled="[true|false]"
  name="policy_name"
>
  <DisplayName>display_name</DisplayName>
  <Properties/>
  <Identifier ref="flow_variable"/>
  <MessageWeight ref="flow_variable"/>
  <Rate ref="flow_variable">rate[pm|ps]</Rate>
  <UseEffectiveCount>[false|true]</UseEffectiveCount>
</SpikeArrest>

Varsayılan politika

Aşağıdaki örnekte, Edge kullanıcı arayüzünde akışınıza Spike Arrest politikası eklediğinizdeki varsayılan ayarlar gösterilmektedir:

<SpikeArrest async="false" continueOnError="false" enabled="true" name="Spike-Arrest-1">
  <DisplayName>Spike Arrest-1</DisplayName>
  <Properties/>
  <Identifier ref="request.header.some-header-name"/>
  <MessageWeight ref="request.header.weight"/>
  <Rate>30ps</Rate>
  <UseEffectiveCount>true</UseEffectiveCount>
</SpikeArrest>

Bu öğe, tüm politikalarda ortak olan aşağıdaki özelliklere sahiptir:

Özellik Varsayılan Zorunlu mu? Açıklama
name Yok Zorunlu

Politikanın dahili adı. name özelliğinin değeri harf, sayı, boşluk, kısa çizgi, alt çizgi ve nokta içerebilir. Bu değer 255 karakteri aşamaz.

İsteğe bağlı olarak, politikayı yönetim kullanıcı arayüzü proxy düzenleyicisinde farklı, doğal bir dille etiketlemek için <DisplayName> öğesini kullanın.

continueOnError yanlış İsteğe bağlı Politika başarısız olduğunda hata döndürmek için "false" değerine ayarlayın. Bu, çoğu politika için beklenen bir durumdur. Bir politika başarısız olsa bile akış yürütmenin devam etmesi için değeri "true" olarak ayarlayın.
enabled true İsteğe bağlı Politikayı uygulamak için "true" (doğru) değerine ayarlayın. Politikayı "kapalı" hale getirmek için "false" değerine ayarlayın. Politika, bir akışa bağlı kalsa bile zorunlu kılınmaz.
async   yanlış Kullanımdan kaldırıldı Bu özellik kullanımdan kaldırıldı.

Örnekler

Aşağıdaki örneklerde, Spike Arrest politikasını kullanabileceğiniz bazı yöntemler gösterilmektedir:

1. Örnek

Aşağıdaki örnekte, hız saniyede beş olarak ayarlanmıştır:

<SpikeArrest name="Spike-Arrest-1">
  <Rate>5ps</Rate>
</SpikeArrest>

Politika, hızı her 200 milisaniyede bir isteğe izin verilecek şekilde düzeltir (1000/5).

2. Örnek

Aşağıdaki örnekte ücret dakikada 300 olarak ayarlanmıştır:

<SpikeArrest async="false" continueOnError="false" enabled="true" name="SpikeArreast">
  <DisplayName>SpikeArreast</DisplayName>
  <Rate>300pm</Rate>
</SpikeArrest>

Etkili oran 300pm'dir. Bu, her 200 milisaniyede bir kovaya yeni bir jeton eklendiği anlamına gelir. Grup boyutu her zaman messagesPerPeriod değerinin% 10'u olarak yapılandırılır. Bu nedenle, 300 messagesPerPeriod ile bucket boyutu 30 jetondur.

3. Örnek

Aşağıdaki örnek, istekleri dakikada 12 ile sınırlar (her beş saniyede bir isteğe izin verilir veya 60/12):

<SpikeArrest name="Spike-Arrest-1">
  <Rate>12pm</Rate>
  <Identifier ref="client_id" />
  <MessageWeight ref="request.header.weight" />
</SpikeArrest>

Ayrıca, <MessageWeight> öğesi, belirli uygulamalar veya istemciler için ileti ağırlıklarını ayarlayan özel bir değer (weight üstbilgisi) kabul eder. Bu, <Identifier> öğesiyle tanımlanan varlıklar için sıklık sınırlama üzerinde ek kontrol sağlar.

4. Örnek

Aşağıdaki örnek, Spike Arrest'in request.header.runtime_rate akış değişkeni olarak iletilen istek aracılığıyla ayarlanan bir çalışma zamanı değerini aramasını ister:

<SpikeArrest name="Spike-Arrest-1">
  <Rate ref="request.header.runtime_rate" />
</SpikeArrest>

Akış değişkeninin değeri intpm veya intps biçiminde olmalıdır.

Bu örneği denemek için aşağıdaki gibi bir istek yürütün:

curl http://myorg-myenv.apigee.net/price -H 'runtime_rate:30ps'

Alt öğe referansı

Bu bölümde, <SpikeArrest> öğesinin alt öğeleri açıklanmaktadır.

<DisplayName>

Politikayı yönetim kullanıcı arayüzü proxy düzenleyicisinde farklı ve daha doğal bir adla etiketlemek için name özelliğine ek olarak kullanın.

<DisplayName> öğesi tüm politikalarda ortaktır.

Varsayılan Değer Yok
Zorunlu mu? İsteğe bağlı. <DisplayName> özelliğini atlarsanız politikanın name özelliğinin değeri kullanılır.
Tür Dize
Üst öğe <PolicyElement>
Alt Öğeler Yok

<DisplayName> öğesi şu söz dizimini kullanır:

Söz dizimi

<PolicyElement>
  <DisplayName>policy_display_name</DisplayName>
  ...
</PolicyElement>

Örnek

<PolicyElement>
  <DisplayName>My Validation Policy</DisplayName>
</PolicyElement>

<DisplayName> öğesinin özelliği veya alt öğesi yoktur.

<Identifier>

İstekleri nasıl gruplandıracağınızı seçmenize olanak tanır. Böylece, Spike Arrest politikası istemciye göre uygulanabilir. Örneğin, istekleri geliştirici kimliğine göre gruplandırabilirsiniz. Bu durumda, her geliştiricinin istekleri, proxy'ye gönderilen tüm istekler yerine kendi ani artış engelleme hızına göre sayılır.

İstek sınırlama üzerinde daha ayrıntılı kontrol için <MessageWeight> öğesiyle birlikte kullanın.

<Identifier> öğesini boş bırakırsanız bu API proxy'sine yapılan tüm istekler için tek bir hız sınırı uygulanır.

Varsayılan Değer Yok
Zorunlu mu? İsteğe bağlı
Tür Dize
Üst öğe <SpikeArrest>
Alt Öğeler Yok

Söz dizimi

<SpikeArrest
  continueOnError="[false|true]"
  enabled="[true|false]"
  name="policy_name"
>
  <Identifier ref="flow_variable"/>
</SpikeArrest>
        

1. Örnek

Aşağıdaki örnekte, Spike Arrest politikası geliştirici kimliği başına uygulanmaktadır:

<SpikeArrest name="Spike-Arrest-1">
  <Identifier ref="developer.id"/>
  <Rate>42pm</Rate/>
</SpikeArrest>

Aşağıdaki tabloda <Identifier> öğesinin özellikleri açıklanmaktadır:

Özellik Açıklama Varsayılan Varlık
ref Spike Arrest'in gelen istekleri gruplandırdığı değişkeni tanımlar. Benzersiz bir istemciyi belirtmek için herhangi bir akış değişkenini kullanabilirsiniz. Örneğin, VerifyAPIKey politikası ile kullanılabilen değişkenler. Ayrıca JavaScript politikası veya AssignMessage politikası'nı kullanarak özel değişkenler de ayarlayabilirsiniz. Yok Zorunlu

Bu öğe, şu Apigee Topluluğu yayınında da ele alınmıştır: http://community.apigee.com/questions/2807/how-does-the-edge-quota-policy-work-when-no-identi.html.

<MessageWeight>

Her ileti için tanımlanan ağırlığı belirtir. Mesaj ağırlığı, tek bir isteğin ani artış önleme oranının hesaplanması üzerindeki etkisini değiştirir. İleti ağırlığı, HTTP üstbilgisi, sorgu parametresi, form parametresi veya ileti gövdesi içeriği gibi herhangi bir akış değişkeni olabilir. JavaScript politikası veya AssignMessage politikası ile özel değişkenler de kullanabilirsiniz.

Belirli istemciler veya uygulamalar tarafından yapılan istekleri daha da sınırlamak için <Identifier> ile birlikte kullanın.

Örneğin, ani artış önleme <Rate> değeri 10pm ise ve bir uygulama 2 ağırlığında istek gönderiyorsa bu istemciden dakikada yalnızca beş mesaja izin verilir. Bunun nedeni, her isteğin 2 olarak sayılmasıdır.

Varsayılan Değer Yok
Zorunlu mu? İsteğe bağlı
Tür Tamsayı
Üst öğe <SpikeArrest>
Alt Öğeler Yok

Söz dizimi

<SpikeArrest
  continueOnError="[false|true]"
  enabled="[true|false]"
  name="policy_name"
>
  <MessageWeight ref="flow_variable"/>
</SpikeArrest>

1. Örnek

Aşağıdaki örnek, istekleri dakikada 12 ile sınırlar (her beş saniyede bir isteğe izin verilir veya 60/12):

<SpikeArrest name="Spike-Arrest-1">
  <Rate>12pm</Rate>
  <Identifier ref="client_id" />
  <MessageWeight ref="request.header.weight" />
</SpikeArrest>

Bu örnekte, <MessageWeight> belirli istemciler için mesaj ağırlıklarını ayarlayan özel bir değeri (istekteki weight başlığı) kabul eder. Bu, <Identifier> öğesiyle tanımlanan varlıklar için sıklık sınırlama üzerinde ek kontrol sağlar.

Aşağıdaki tabloda <MessageWeight> öğesinin özellikleri açıklanmaktadır:

Özellik Açıklama Varlık Varsayılan
ref Belirli istemcinin ileti ağırlığını içeren akış değişkenini tanımlar. Bu, HTTP sorgu parametresi, üstbilgi veya ileti gövdesi içeriği gibi herhangi bir akış değişkeni olabilir. Daha fazla bilgi için Akış değişkenleri referansı başlıklı makaleyi inceleyin. Ayrıca JavaScript politikası veya AssignMessage politikası'nı kullanarak özel değişkenler de ayarlayabilirsiniz. Zorunlu Yok

<Rate>

Dakika veya saniye aralıklarında izin verilen istek sayısını ayarlayarak trafik artışlarını (veya patlamalarını) sınırlama hızını belirtir. Bu öğeyi, istemciden değer kabul ederek çalışma zamanında trafiği sorunsuz bir şekilde sınırlamak için <Identifier> ve <MessageWeight> ile birlikte de kullanabilirsiniz.

Varsayılan Değer Yok
Zorunlu mu? Zorunlu
Tür Tamsayı
Üst öğe <SpikeArrest>
Alt Öğeler Yok

Söz dizimi

Fiyatları aşağıdaki yöntemlerden biriyle belirtebilirsiniz:

  • <Rate> öğesinin gövdesi olarak belirttiğiniz statik bir fiyat
  • İstemci tarafından iletilebilen bir değişken değeri; ref özelliğini kullanarak akış değişkeninin adını tanımlayın.
<SpikeArrest
  continueOnError="[false|true]"
  enabled="[true|false]"
  name="policy_name"
>
  <Rate ref="flow_variable">rate[pm|ps]</Rate>
</SpikeArrest>

Geçerli oran değerleri (değişken değeri olarak veya öğenin gövdesinde tanımlanmış) aşağıdaki biçime uygun olmalıdır:

  • intps (saniye başına istek sayısı, milisaniye aralıklarına düzeltilmiş)
  • intpm (dakika başına istek sayısı, saniyelik aralıklarla düzeltilmiş)

int değeri pozitif ve sıfır olmayan bir tam sayı olmalıdır.

1. Örnek

Aşağıdaki örnekte, hız saniyede beş istek olarak ayarlanmıştır:

<SpikeArrest name="Spike-Arrest-1">
  <Rate>5ps</Rate>
</SpikeArrest>

Politika, hızı her 200 milisaniyede bir isteğe izin verilecek şekilde düzeltir (1000/5).

2. Örnek

Aşağıdaki örnekte, oran dakikada 12 istek olarak ayarlanmıştır:

<SpikeArrest async="false" continueOnError="false" enabled="true" name="SpikeArreast">
  <DisplayName>SpikeArreast</DisplayName>
  <Rate>300pm</Rate>
</SpikeArrest>

Bu örnek politika, hızı her beş saniyede bir isteğe izin verilecek şekilde düzeltir (60/12).

Aşağıdaki tabloda <Rate> öğesinin özellikleri açıklanmaktadır:

Özellik Açıklama Varlık Varsayılan
ref Ücreti belirten bir akış değişkenini tanımlar. Bu, HTTP sorgu parametresi, üstbilgi veya ileti gövdesi içeriği gibi herhangi bir akış değişkeni ya da KVM gibi bir değer olabilir. Daha fazla bilgi için Akış değişkenleri referansı başlıklı makaleyi inceleyin.

JavaScript politikası veya AssignMessage politikası'nı kullanarak özel değişkenler de kullanabilirsiniz.

Hem ref hem de bu öğenin gövdesini tanımlarsanız akış değişkeni istekte ayarlandığında ref değeri uygulanır ve öncelikli olur. (ref bölümünde tanımlanan değişken istekte ayarlanmadığında bunun tersi geçerlidir.)

Örneğin:

<Rate ref="request.header.custom_rate">1pm</Rate>

Bu örnekte, istemci "custom_rate" üstbilgisini geçirmezse API proxy'sinin hızı tüm istemciler için dakikada 1 istek olur. İstemci bir "custom_rate" üstbilgisi iletirse, proxy'deki tüm istemciler için hız sınırı, "custom_rate" üstbilgisi olmadan bir istek gönderilene kadar saniyede 10 istek olur.

Farklı türdeki istemciler için özel ücretler uygulamak üzere istekleri gruplandırmak için <Identifier> kullanabilirsiniz.

ref için bir değer belirtirseniz ancak <Rate> öğesinin gövdesinde oranı ayarlamazsanız ve istemci bir değer iletmezse Spike Arrest politikası hata verir.

İsteğe bağlı Yok

<UseEffectiveCount>

Otomatik ölçeklendirme grupları kullanılırken ani artış engelleme sayılarınızı mesaj işlemciler (MP) arasında dağıtır.

Söz dizimi

<SpikeArrest
  continueOnError="[false|true]"
  enabled="[true|false]"
  name="policy_name"
>
  <UseEffectiveCount>[false|true]</UseEffectiveCount>
</SpikeArrest>

1. Örnek

Aşağıdaki örnekte <UseEffectiveCount> değeri true olarak ayarlanır:

<SpikeArrest name='Spike-Arrest-1'>
  <Rate>40ps</Rate>
  <UseEffectiveCount>true</UseEffectiveCount>
</SpikeArrest>

<UseEffectiveCount> öğesi isteğe bağlıdır. Öğe, ani artış engelleme politikanızda atlandığında varsayılan değer false olur.

Varsayılan Değer Yanlış
Zorunlu mu? İsteğe bağlı
Tür Boole
Üst öğe <SpikeArrest>
Alt Öğeler Yok

Aşağıdaki tabloda <UseEffectiveCount> öğesinin özellikleri açıklanmaktadır:

Özellik Açıklama Varsayılan Varlık
ref <UseEffectiveCount> değerini içeren değişkeni tanımlar. Bu, HTTP sorgu parametresi, üstbilgi veya ileti gövdesi içeriği gibi herhangi bir akış değişkeni olabilir. Daha fazla bilgi için Akış değişkenleri referansı başlıklı makaleyi inceleyin. Ayrıca JavaScript politikası veya AssignMessage politikası'nı kullanarak özel değişkenler de ayarlayabilirsiniz. Yok İsteğe bağlı

<UseEffectiveCount> öğesinin etkisi değerine bağlıdır:

  • true: Bir MP'nin ani artış hızı sınırı, <Rate> değerinin aynı kapsüldeki mevcut MP sayısına bölünmesiyle elde edilir. Toplam sınır, <Rate> değeridir. MP'ler dinamik olarak eklendiğinde (veya kaldırıldığında) her birinin ayrı ayrı ani artış sıklığı sınırları artar (veya azalır) ancak toplam sınır aynı kalır.
  • false: Her MP'nin ani artış hızı sınırı, <Rate> değeridir. Toplu sınır, tüm MP'lerin oranlarının toplamıdır. MP'ler eklendiğinde (veya kaldırıldığında) bunların bireysel ani artış hızı sınırları aynı kalır ancak toplu sınır artar (veya azalır).

SpikeArrest politikası, belirttiğiniz hız sınırını daha küçük aralıklara bölerek trafik artışlarını yumuşatan bir "token bucket" algoritması kullanır. Bu yaklaşımın dezavantajı, kısa bir süre içinde gelen birden fazla meşru isteğin reddedilebilmesidir.

Örneğin, 30pm (dakikada 30 istek) hızını girdiğinizi varsayalım. Test sırasında, bir dakika içinde gönderildiği sürece 1 saniyede 30 istek gönderebileceğinizi düşünebilirsiniz. Ancak politika, ayarı bu şekilde zorunlu kılmaz. Düşündüğünüzde, 1 saniyelik süre içinde 30 istek bazı ortamlarda küçük bir ani artış olarak kabul edilebilir.

  • Dakika başına oranlar, saniyelik aralıklarla izin verilen tam istekler hâline getirilir.

    Örneğin, 30pm değeri şu şekilde düzeltilir:
    60 saniye (1 dakika) / 30pm = 2 saniyelik aralıklar veya her 2 saniyede 1 istek gönderilmesine izin verilir. 2 saniye içinde gönderilen ikinci istek başarısız olur. Ayrıca, bir dakika içinde 31. istek de başarısız olur.

  • Saniye başına oranlar, milisaniye aralıklarında izin verilen tam istekler olarak düzeltilir.

    Örneğin, 10ps şu şekilde düzeltilir:
    1.000 milisaniye (1 saniye) / 10ps = 100 milisaniyelik aralıklar veya her 100 milisaniyede 1 isteğe izin verilir. 100 ms içinde gönderilen ikinci istek başarısız olur. Ayrıca, bir saniye içinde gönderilen 11. istek başarısız olur.

Aşağıdaki tabloda, <UseEffectiveCount> değerinin her MP'nin etkin hız sınırına etkisi gösterilmektedir:

<UseEffectiveCount> değeri
false false false true true true
Milletvekili sayısı 8 4 2 8 4 2
<Rate> değeri 10 10 10 40 112 40
MP başına efektif oran 10 10 10 5 10 20
Toplam Sınır 80 40 20 40* 40* 40*
* <Rate> ile aynıdır.

Bu örnekte, MP sayısı 4'ten 2'ye düşürüldüğünde ve <UseEffectiveCount> değeri false olduğunda MP başına etkili oranın aynı kaldığını (10) unutmayın. Ancak <UseEffectiveCount>, true olduğunda MP sayısı 4'ten 2'ye düşürüldüğünde MP başına etkin oran 10'dan 20'ye çıkar.

Akış değişkenleri

Spike Arrest politikası yürütüldüğünde aşağıdaki akış değişkeni doldurulur:

Değişken Tür İzin Açıklama
ratelimit.policy_name.failed Boole Salt Okunur Politikanın başarısız olup olmadığını (true veya false) gösterir.

Daha fazla bilgi için Akış değişkenleri referansı başlıklı makaleyi inceleyin.

Hata referansı

This section describes the fault codes and error messages that are returned and fault variables that are set by Edge when this policy triggers an error. This information is important to know if you are developing fault rules to handle faults. To learn more, see What you need to know about policy errors and Handling faults.

Runtime errors

These errors can occur when the policy executes.

Fault code HTTP status Cause Fix
policies.ratelimit.FailedToResolveSpikeArrestRate 500 This error occurs if the reference to the variable containing the rate setting within the <Rate> element cannot be resolved to a value within the Spike Arrest policy. This element is mandatory and used to specify the spike arrest rate in the form of intpm or intps.
policies.ratelimit.InvalidMessageWeight 500 This error occurs if the value specified for the <MessageWeight> element through a flow variable is invalid (a non-integer value).
policies.ratelimit.SpikeArrestViolation 429

The rate limit was exceeded.

Deployment errors

These errors can occur when you deploy a proxy containing this policy.

Error name Cause Fix
InvalidAllowedRate If the spike arrest rate specified in the <Rate> element of the Spike Arrest Policy is not an integer or if the rate does not have ps or pm as a suffix, then the deployment of the API proxy fails.

Fault variables

These variables are set when a runtime error occurs. For more information, see What you need to know about policy errors.

Variables Where Example
fault.name="fault_name" fault_name is the name of the fault, as listed in the Runtime errors table above. The fault name is the last part of the fault code. fault.name Matches "SpikeArrestViolation"
ratelimit.policy_name.failed policy_name is the user-specified name of the policy that threw the fault. ratelimit.SA-SpikeArrestPolicy.failed = true

Example error response

Shown below is an example error response:

{  
   "fault":{  
      "detail":{  
         "errorcode":"policies.ratelimit.SpikeArrestViolation"
      },
      "faultstring":"Spike arrest violation. Allowed rate : 10ps"
   }
}

Example fault rule

Shown below is an example fault rule to handle a SpikeArrestViolation fault:

<FaultRules>
    <FaultRule name="Spike Arrest Errors">
        <Step>
            <Name>JavaScript-1</Name>
            <Condition>(fault.name Matches "SpikeArrestViolation") </Condition>
        </Step>
        <Condition>ratelimit.Spike-Arrest-1.failed=true</Condition>
    </FaultRule>
</FaultRules>

Kota veya ani artış önleme politikası tarafından belirlenen bir hız sınırının aşılmasıyla ilgili mevcut HTTP durum kodu 429 (Çok Fazla İstek) şeklindedir. HTTP durum kodunu 500 (Dahili Sunucu Hatası) olarak değiştirmek için features.isHTTPStatusTooManyRequestEnabled özelliğini false olarak ayarlayın. Bu işlem için Update organization properties API'sini kullanın.

Örneğin:

curl -u email:password -X POST -H "Content-type:application/xml" http://api.enterprise.apigee.com/v1/organizations/myorg -d \
"<Organization type="trial" name="MyOrganization">
    <Properties>
        <Property name="features.isHTTPStatusTooManyRequestEnabled">true</Property>
        . . .
    </Properties>
</Organization>"

Şemalar

Her politika türü bir XML şeması (.xsd) ile tanımlanır. Referans olarak politika şemaları GitHub'da mevcuttur.

İlgili konular