Anda sedang melihat dokumentasi Apigee Edge.
Buka
dokumentasi Apigee X. info
Kebijakan Spike Arrest melindungi dari lonjakan traffic dengan elemen <Rate>. Elemen
ini membatasi jumlah permintaan yang diproses oleh proxy API dan dikirim ke backend,
sehingga melindungi dari penurunan performa dan periode nonaktif.
Elemen <SpikeArrest>
Menentukan kebijakan Spike Arrest.
| Nilai Default | Lihat tab Kebijakan Default di bawah |
| Wajib? | Opsional |
| Jenis | Objek kompleks |
| Elemen Induk | t/a |
| Elemen Turunan |
<Identifier><MessageWeight><Rate> (Wajib)<UseEffectiveCount> |
Sintaksis
Elemen <SpikeArrest> menggunakan sintaksis berikut:
<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>
Kebijakan Default
Contoh berikut menunjukkan setelan default saat Anda menambahkan kebijakan Pembatasan Lonjakan ke flow di UI Edge:
<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>
Elemen ini memiliki atribut berikut yang sama untuk semua kebijakan:
| Atribut | Default | Wajib? | Deskripsi |
|---|---|---|---|
name |
T/A | Wajib |
Nama internal kebijakan. Nilai atribut Secara opsional, gunakan elemen |
continueOnError |
false | Opsional | Tetapkan ke "false" untuk menampilkan error saat kebijakan gagal. Hal ini wajar untuk sebagian besar kebijakan. Tetapkan ke "true" agar eksekusi flow berlanjut meskipun kebijakan gagal. |
enabled |
benar | Opsional | Tetapkan ke "true" untuk menerapkan kebijakan. Tetapkan ke "false" untuk "menonaktifkan" kebijakan. Kebijakan ini tidak akan diterapkan meskipun tetap dilampirkan ke flow. |
async |
false | Tidak digunakan lagi | Atribut ini tidak digunakan lagi. |
Contoh
Contoh berikut menunjukkan beberapa cara penggunaan kebijakan Spike Arrest:
Contoh 1
Contoh berikut menetapkan kecepatan menjadi lima per detik:
<SpikeArrest name="Spike-Arrest-1"> <Rate>5ps</Rate> </SpikeArrest>
Kebijakan ini memperlancar laju menjadi satu permintaan yang diizinkan setiap 200 milidetik (1000/5).
Contoh 2
Contoh berikut menetapkan kecepatan ke 300 per menit:
<SpikeArrest async="false" continueOnError="false" enabled="true" name="SpikeArreast"> <DisplayName>SpikeArreast</DisplayName> <Rate>300pm</Rate> </SpikeArrest>
Kecepatan efektifnya adalah 300pm, yang berarti token baru ditambahkan ke bucket setiap 200 milidetik. Ukuran bucket selalu dikonfigurasi menjadi 10% dari messagesPerPeriod. Oleh karena itu, dengan messagesPerPeriod 300, ukuran bucket adalah 30 token.
Contoh 3
Contoh berikut membatasi permintaan hingga 12 per menit (satu permintaan diizinkan setiap lima detik, atau 60/12):
<SpikeArrest name="Spike-Arrest-1"> <Rate>12pm</Rate> <Identifier ref="client_id" /> <MessageWeight ref="request.header.weight" /> </SpikeArrest>
Selain itu, elemen <MessageWeight> menerima nilai kustom (header
weight) yang menyesuaikan bobot pesan untuk aplikasi atau klien tertentu. Hal ini memberikan kontrol tambahan atas pembatasan untuk entitas yang diidentifikasi dengan elemen <Identifier>.
Contoh 4
Contoh berikut menginstruksikan Spike Arrest untuk mencari nilai runtime yang ditetapkan melalui
permintaan yang diteruskan sebagai variabel alur request.header.runtime_rate:
<SpikeArrest name="Spike-Arrest-1"> <Rate ref="request.header.runtime_rate" /> </SpikeArrest>
Nilai variabel alur harus dalam bentuk intpm atau
intps.
Untuk mencoba contoh ini, jalankan permintaan seperti berikut:
curl http://myorg-myenv.apigee.net/price -H 'runtime_rate:30ps'
Referensi elemen turunan
Bagian ini menjelaskan elemen turunan <SpikeArrest>.
<DisplayName>
Gunakan selain atribut name untuk memberi label pada kebijakan di
editor proxy UI pengelolaan dengan nama yang berbeda dan terdengar lebih alami.
Elemen <DisplayName> umum untuk semua kebijakan.
| Nilai Default | t/a |
| Wajib? | Opsional. Jika Anda tidak menyertakan <DisplayName>, nilai atribut name kebijakan akan digunakan |
| Jenis | String |
| Elemen Induk | <PolicyElement> |
| Elemen Turunan | Tidak ada |
Elemen <DisplayName> menggunakan sintaksis berikut:
Sintaksis
<PolicyElement> <DisplayName>policy_display_name</DisplayName> ... </PolicyElement>
Contoh
<PolicyElement> <DisplayName>My Validation Policy</DisplayName> </PolicyElement>
Elemen <DisplayName> tidak memiliki atribut atau elemen turunan.
<Identifier>
Memungkinkan Anda memilih cara mengelompokkan permintaan sehingga kebijakan Pembatasan Lonjakan dapat diterapkan berdasarkan klien. Misalnya, Anda dapat mengelompokkan permintaan berdasarkan ID developer, yang dalam hal ini setiap permintaan developer akan dihitung berdasarkan rasio Spike Arrest-nya sendiri, bukan semua permintaan ke proxy.
Gunakan bersama dengan elemen <MessageWeight> untuk kontrol yang lebih mendetail terhadap pembatasan permintaan.
Jika Anda mengosongkan elemen <Identifier>, satu batas frekuensi akan diterapkan untuk semua permintaan
ke proxy API tersebut.
| Nilai Default | t/a |
| Wajib? | Opsional |
| Jenis | String |
| Elemen Induk |
<SpikeArrest>
|
| Elemen Turunan | Tidak ada |
Sintaksis
<SpikeArrest continueOnError="[false|true]" enabled="[true|false]" name="policy_name" > <Identifier ref="flow_variable"/> </SpikeArrest>
Contoh 1
Contoh berikut menerapkan kebijakan Spike Arrest per ID developer:
<SpikeArrest name="Spike-Arrest-1"> <Identifier ref="developer.id"/> <Rate>42pm</Rate/> </SpikeArrest>
Tabel berikut menjelaskan atribut <Identifier>:
| Atribut | Deskripsi | Default | Ketersediaan |
|---|---|---|---|
ref |
Mengidentifikasi variabel yang digunakan Spike Arrest untuk mengelompokkan permintaan masuk. Anda dapat menggunakan variabel alur apa pun untuk menunjukkan klien yang unik, seperti yang tersedia dengan kebijakan VerifyAPIKey. Anda juga dapat menetapkan variabel kustom menggunakan kebijakan JavaScript atau kebijakan AssignMessage. | t/a | Wajib |
Elemen ini juga dibahas dalam postingan Komunitas Apigee berikut: Quota Identifier Across Different Policies.
<MessageWeight>
Menentukan pembobotan yang ditentukan untuk setiap pesan. Bobot pesan mengubah dampak satu permintaan pada penghitungan tingkat Pembatasan Lonjakan. Bobot pesan dapat berupa variabel alur apa pun, seperti header HTTP, parameter kueri, parameter formulir, atau konten isi pesan. Anda juga dapat menggunakan variabel kustom menggunakan kebijakan JavaScript atau kebijakan AssignMessage.
Gunakan bersama dengan <Identifier> untuk membatasi lebih lanjut permintaan dari
klien atau aplikasi tertentu.
Misalnya, jika Pembatasan Lonjakan <Rate> adalah 10pm, dan aplikasi mengirimkan
permintaan dengan bobot 2, maka hanya lima pesan per menit yang diizinkan dari
klien tersebut karena setiap permintaan dihitung sebagai 2.
| Nilai Default | t/a |
| Wajib? | Opsional |
| Jenis | Bilangan bulat |
| Elemen Induk |
<SpikeArrest>
|
| Elemen Turunan | Tidak ada |
Sintaksis
<SpikeArrest continueOnError="[false|true]" enabled="[true|false]" name="policy_name" > <MessageWeight ref="flow_variable"/> </SpikeArrest>
Contoh 1
Contoh berikut membatasi permintaan hingga 12 per menit (satu permintaan diizinkan setiap lima detik, atau 60/12):
<SpikeArrest name="Spike-Arrest-1"> <Rate>12pm</Rate> <Identifier ref="client_id" /> <MessageWeight ref="request.header.weight" /> </SpikeArrest>
Dalam contoh ini, <MessageWeight> menerima nilai kustom (header weight
dalam permintaan) yang menyesuaikan bobot pesan untuk klien tertentu. Hal ini memberikan kontrol tambahan atas pembatasan untuk entitas yang diidentifikasi dengan elemen <Identifier>.
Tabel berikut menjelaskan atribut <MessageWeight>:
| Atribut | Deskripsi | Ketersediaan | Default |
|---|---|---|---|
ref |
Mengidentifikasi variabel alur yang berisi bobot pesan untuk klien tertentu. Nilai ini dapat berupa variabel alur apa pun, seperti parameter kueri HTTP, header, atau konten isi pesan. Untuk mengetahui informasi selengkapnya, lihat Referensi variabel alur. Anda juga dapat menetapkan variabel kustom menggunakan kebijakan JavaScript atau kebijakan AssignMessage. | Wajib | T/A |
<Rate>
Menentukan kecepatan untuk membatasi lonjakan (atau burst) traffic dengan menetapkan jumlah
permintaan yang diizinkan dalam interval per menit atau per detik. Anda juga dapat menggunakan elemen ini bersama dengan
<Identifier> dan <MessageWeight> untuk
membatasi traffic dengan lancar saat runtime dengan menerima nilai dari klien.
| Nilai Default | t/a |
| Wajib? | Wajib |
| Jenis | Bilangan bulat |
| Elemen Induk |
<SpikeArrest>
|
| Elemen Turunan | Tidak ada |
Sintaksis
Anda dapat menentukan tarif dengan salah satu cara berikut:
- Tarif statis yang Anda tentukan sebagai isi elemen
<Rate> - Nilai variabel, yang dapat diteruskan oleh klien; identifikasi
nama variabel alur menggunakan atribut
ref
<SpikeArrest continueOnError="[false|true]" enabled="[true|false]" name="policy_name" > <Rate ref="flow_variable">rate[pm|ps]</Rate> </SpikeArrest>
Nilai tarif yang valid (baik ditentukan sebagai nilai variabel atau di isi elemen) harus sesuai dengan format berikut:
intps(jumlah permintaan per detik, dihaluskan ke dalam interval milidetik)intpm(jumlah permintaan per menit, dihaluskan ke dalam interval detik)
Nilai int harus berupa bilangan bulat positif bukan nol.
Contoh 1
Contoh berikut menetapkan kecepatan ke lima permintaan per detik:
<SpikeArrest name="Spike-Arrest-1"> <Rate>5ps</Rate> </SpikeArrest>
Kebijakan ini memperlancar laju menjadi satu permintaan yang diizinkan setiap 200 milidetik (1000/5).
Contoh 2
Contoh berikut menetapkan kecepatan ke 12 permintaan per menit:
<SpikeArrest async="false" continueOnError="false" enabled="true" name="SpikeArreast"> <DisplayName>SpikeArreast</DisplayName> <Rate>300pm</Rate> </SpikeArrest>
Contoh kebijakan ini memperlancar laju ke satu permintaan yang diizinkan setiap lima detik (60/12).
Tabel berikut menjelaskan atribut <Rate>:
| Atribut | Deskripsi | Ketersediaan | Default |
|---|---|---|---|
ref |
Mengidentifikasi variabel alur yang menentukan tarif. Nilai ini dapat berupa variabel alur apa pun, seperti parameter kueri HTTP, header, atau konten isi pesan, atau nilai seperti KVM. Untuk mengetahui informasi selengkapnya, lihat Referensi variabel alur.
Anda juga dapat menggunakan variabel kustom menggunakan kebijakan JavaScript atau kebijakan AssignMessage. Jika Anda menentukan Contoh: <Rate ref="request.header.custom_rate">1pm</Rate> Dalam contoh ini, jika klien tidak meneruskan header "custom_rate", maka batas permintaan untuk proxy API adalah 1 permintaan per menit untuk semua klien. Jika klien meneruskan header "custom_rate", batas frekuensi akan menjadi 10 permintaan per detik untuk semua klien di proxy — hingga permintaan tanpa header "custom_rate" dikirim. Anda dapat menggunakan Jika Anda menentukan nilai untuk |
Opsional | t/a |
Rate yang menentukan perilaku pembatasan traffic:
| Atribut | Deskripsi |
|---|---|
messagesPerPeriod |
Menentukan jumlah pesan yang diizinkan dalam jangka waktu yang ditentukan. Misalnya, jika kebijakan dikonfigurasi untuk '10ps' (10 per detik), nilai
messagesPerPeriod adalah 10. |
periodInMicroseconds |
Menentukan jangka waktu, dalam mikrodetik, yang digunakan untuk menghitung
messagesPerPeriod. Untuk konfigurasi '10ps', nilai ini adalah 1.000.000, yang setara dengan satu detik. |
maxBurstMessageCount |
Mewakili jumlah maksimum permintaan yang dapat diizinkan secara instan atau dalam burst singkat di awal interval baru. |
<UseEffectiveCount>
Mendistribusikan jumlah Spike Arrest di seluruh Pemroses Pesan (MP) saat menggunakan grup penskalaan otomatis.
Sintaksis
<SpikeArrest continueOnError="[false|true]" enabled="[true|false]" name="policy_name" > <UseEffectiveCount>[false|true]</UseEffectiveCount> </SpikeArrest>
Contoh 1
Contoh berikut menetapkan <UseEffectiveCount> ke benar (true):
<SpikeArrest name='Spike-Arrest-1'> <Rate>40ps</Rate> <UseEffectiveCount>true</UseEffectiveCount> </SpikeArrest>
Elemen <UseEffectiveCount> bersifat opsional. Nilai defaultnya adalah false
jika elemen tidak disertakan dalam kebijakan Pembatasan Lonjakan.
| Nilai Default | Salah |
| Wajib? | Opsional |
| Jenis | Boolean |
| Elemen Induk |
<SpikeArrest>
|
| Elemen Turunan | Tidak ada |
Tabel berikut menjelaskan atribut elemen <UseEffectiveCount>:
| Atribut | Deskripsi | Default | Ketersediaan |
|---|---|---|---|
ref |
Mengidentifikasi variabel yang berisi nilai <UseEffectiveCount>. Nilai ini dapat berupa
variabel alur apa pun, seperti parameter kueri HTTP, header, atau konten isi pesan. Untuk mengetahui informasi selengkapnya, lihat Referensi variabel alur. Anda juga dapat menetapkan variabel kustom
menggunakan kebijakan JavaScript atau kebijakan AssignMessage. |
t/a | Opsional |
Efek <UseEffectiveCount> bergantung pada nilainya:
true: Batas laju lonjakan MP adalah<Rate>dibagi dengan jumlah MP saat ini dalam pod yang sama. Batas gabungan adalah nilai<Rate>. Saat MP ditambahkan (atau dihapus) secara dinamis, batas laju lonjakan masing-masing akan meningkat (atau menurun), tetapi batas gabungan akan tetap sama.false: Batas laju lonjakan setiap MP hanyalah nilai<Rate>-nya. Batas gabungan adalah jumlah tarif semua MP. Saat MP ditambahkan (atau dihapus), batas laju lonjakan masing-masing akan tetap sama, tetapi batas gabungan akan meningkat (atau berkurang).
Kebijakan SpikeArrest menggunakan algoritma "token bucket" yang memperlancar lonjakan traffic dengan membagi batas kapasitas yang Anda tentukan ke dalam interval yang lebih kecil. Kelemahan pendekatan ini adalah beberapa permintaan yang sah yang masuk dalam interval waktu singkat berpotensi ditolak.
Misalnya, Anda memasukkan kecepatan 30pm (30 permintaan per menit). Saat pengujian, Anda mungkin berpikir Anda dapat mengirim 30 permintaan dalam 1 detik, selama permintaan tersebut masuk dalam satu menit. Namun, bukan begitu cara kebijakan menerapkan setelan. Jika dipikir-pikir, 30 permintaan dalam periode 1 detik dapat dianggap sebagai lonjakan kecil di beberapa lingkungan.
- Rasio per menit akan disesuaikan menjadi permintaan penuh yang diizinkan dalam interval
detik.
Misalnya, 30 pm akan di-smoothing seperti ini:
60 detik (1 menit) / 30 pm = interval 2 detik, atau 1 permintaan diizinkan setiap 2 detik. Permintaan kedua dalam waktu 2 detik akan gagal. Selain itu, permintaan ke-31 dalam satu menit akan gagal. - Kecepatan per detik dihaluskan menjadi permintaan penuh yang diizinkan dalam interval
milidetik.
Misalnya, 10ps di-smoothing seperti ini:
1.000 milidetik (1 detik) / 10ps = interval 100 milidetik, atau 1 permintaan diizinkan setiap 100 milidetik. Permintaan kedua dalam waktu 100 md akan gagal. Selain itu, permintaan ke-11 dalam satu detik akan gagal.
Tabel berikut menunjukkan efek <UseEffectiveCount> pada batas frekuensi efektif setiap MP:
Nilai <UseEffectiveCount> |
||||||
|---|---|---|---|---|---|---|
false |
false |
false |
true |
true |
true |
|
| # Anggota Parlemen | 8 | 4 | 2 | 8 | 4 | 2 |
Nilai <Rate> |
10 | 10 | 10 | 40 | 40 | 40 |
| Rasio Efektif per MP | 10 | 10 | 10 | 5 | 10 | 20 |
| Batas Gabungan | 80 | 40 | 20 | 40* | 40* | 40* |
* Sama seperti <Rate>. |
||||||
Dalam contoh ini, perhatikan bahwa saat jumlah MP dikurangi dari 4 menjadi 2, dan
<UseEffectiveCount> adalah false, rasio efektif per MP tetap sama (di
10). Namun, jika <UseEffectiveCount> adalah true, rasio efektif per MP akan berubah dari
10 menjadi 20 saat jumlah MP dikurangi dari 4 menjadi 2.
Variabel alur
Saat kebijakan Pembatasan Lonjakan dieksekusi, variabel alur berikut akan diisi:
| Variabel | Jenis | Izin | Deskripsi |
|---|---|---|---|
ratelimit.policy_name.failed |
Boolean | Hanya Baca | Menunjukkan apakah kebijakan gagal atau tidak (true atau
false). |
Untuk mengetahui informasi selengkapnya, lihat Referensi variabel alur.
Referensi error
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. |
build |
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). |
build |
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. |
build |
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>Kode status HTTP saat ini untuk melampaui batas frekuensi yang ditetapkan oleh kebijakan Quota atau Spike Arrest
adalah 429 (Terlalu Banyak Permintaan). Untuk mengubah kode status HTTP menjadi 500
(Error Server Internal), tetapkan
properti features.isHTTPStatusTooManyRequestEnabled ke false menggunakan
API
Update organization properties.
Contoh:
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>"
Skema
Setiap jenis kebijakan ditentukan oleh skema XML (.xsd). Sebagai referensi, skema kebijakan
tersedia di GitHub.
Topik terkait
- Kebijakan kuota: Kebijakan kuota, untuk membatasi traffic pada setiap klien
- Pembatasan kapasitas untuk ringkasan pembatasan kapasitas
- Membandingkan Kebijakan Kuota dan SpikeArrest
- Contoh proxy API yang berfungsi