Coba lagi

BERLAKU UNTUK: Semua tingkatAN API Management

Kebijakan retry menjalankan kebijakan turunannya satu kali dan kemudian mencoba kembali eksekusinya hingga percobaan ulang condition menjadi false atau coba lagi count habis.

Kebijakan ini retry mungkin berisi kebijakan lain sebagai elemen turunannya, kecuali untuk wait kebijakan.

Catatan

Tetapkan elemen kebijakan dan elemen turunan dalam urutan yang disediakan dalam pernyataan kebijakan. Pelajari lebih lanjut cara mengatur atau mengedit kebijakan API Management.

Pernyataan kebijakan

<retry
    condition="Boolean expression or literal"
    count="number of retry attempts"
    interval="retry interval in seconds"
    max-interval="maximum retry interval in seconds"
    delta="retry interval delta in seconds"
    first-fast-retry="boolean expression or literal">
        <!-- One or more child policies. No restrictions. -->
</retry>

Atribut

Atribut Deskripsi Wajib diisi Bawaan
kondisi Boolean. Menentukan apakah percobaan ulang harus dihentikan (false) atau dilanjutkan (true). Ekspresi kebijakan diizinkan. Ya T/A
jumlah Angka positif antara 1 dan 50 menentukan jumlah percobaan ulang yang akan dicoba. Ekspresi kebijakan diizinkan. Ya T/A
interval Angka positif dalam detik yang menentukan interval tunggu antara percobaan ulang. Ekspresi kebijakan diizinkan. Ya T/A
interval maks Angka positif dalam detik yang menentukan interval tunggu maksimum antara percobaan ulang. Ini digunakan untuk mengimplementasikan algoritme percobaan ulang eksponensial. Ekspresi kebijakan diizinkan. Tidak. T/A
delta Angka positif dalam detik yang menentukan kenaikan interval tunggu. Ini digunakan untuk mengimplementasikan algoritme percobaan ulang linier dan eksponensial. Ekspresi kebijakan diizinkan. Tidak. T/A
pertama-cepat-coba lagi Boolean. Jika disetel ke true, percobaan ulang pertama akan segera dilakukan. Ekspresi kebijakan diizinkan. Tidak. false

Waktu tunggu untuk kueri

  • Jika hanya interval yang ditentukan, percobaan ulang interval tetap dilakukan.

  • Saat hanya interval dan delta yang ditentukan, algoritma coba lagi interval linear akan digunakan. Waktu tunggu di antara coba lagi semakin meningkat menurut rumus berikut ini: interval + (count - 1)*delta.

  • Saat hanya interval, max-interval, dan delta yang ditetapkan, algoritma coba lagi interval eksponensial akan digunakan. Waktu tunggu di antara coba lagi semakin meningkat menurut rumus berikut ini: interval + (2^(count - 1)) * random(delta * 0.8, delta * 1.2), hingga interval maksimum yang ditetapkan oleh max-interval.

    Sebagai contoh, saat interval dan delta ditetapkan ke 10 detik, dan max-interval ditetapkan ke 100 detik, rata-rata waktu tunggu di antara coba lagi akan meningkat dengan interval sebagai berikut: 10 detik, 20 detik, 40 detik, 80 detik, dan 100 detik untuk coba lagi yang tersisa.

Elemen

Kebijakan ini retry mungkin berisi kebijakan lain sebagai elemen turunannya, kecuali untuk wait kebijakan.

Penggunaan

Catatan penggunaan

  • Kebijakan menjalankan kebijakan turunan di retry blok sebelum mengevaluasi condition untuk menjalankan upaya coba lagi pertama.

Contoh

Meminta penerusan dengan coba lagi eksponensial

Dalam contoh berikut, penerusan permintaan dicoba ulang hingga sepuluh kali menggunakan algoritme percobaan ulang eksponensial. Karena first-fast-retry diatur ke false, semua upaya coba lagi tunduk pada waktu tunggu coba lagi yang meningkat secara eksponensial (dalam contoh ini, sekitar 10 detik, 20 detik, 40 detik, ...), hingga penantian max-intervalmaksimum .

<retry
    condition="@(context.Response.StatusCode == 500)"
    count="10"
    interval="10"
    max-interval="100"
    delta="10"
    first-fast-retry="false">
        <forward-request buffer-request-body="true" />
</retry>

Kirim permintaan setelah permintaan awal gagal

Dalam contoh berikut, mengirim permintaan ke URL selain backend yang ditentukan dicoba ulang hingga tiga kali jika koneksi terputus/kehabisan waktu, atau permintaan menghasilkan kesalahan sisi server. Sejak first-fast-retry diatur dengan benar, coba lagi pertama dijalankan segera setelah kegagalan permintaan awal. Perhatikan bahwa send-request harus diatur ignore-error dengan benar agar response-variable-name menjadi null jika terjadi kesalahan.


<retry
    condition="@(context.Variables["response"] == null || ((IResponse)context.Variables["response"]).StatusCode >= 500)"
    count="3"
    interval="1"
    first-fast-retry="true">
        <send-request 
            mode="new" 
            response-variable-name="response" 
            timeout="3" 
            ignore-error="true">
		        <set-url>https://api.contoso.com/products/5</set-url>
		        <set-method>GET</set-method>
		</send-request>
</retry>

Beralih backend saat kesalahan diterima

Dalam contoh berikut, permintaan awal dikirim ke backend utama. 429 Too Many Requests Jika kode status respons dikembalikan, permintaan akan segera dicoba dan diteruskan ke backend sekunder.

<backend>
    <retry
        condition="@(context.Response != null && context.Response.StatusCode == 429)"
        count="1"
        interval="1"
        first-fast-retry="true">
           <set-variable name="attempt-count" value="@(context.Variables.GetValueOrDefault<int>("attempt-count", 0)+1)" />
           <set-backend-service backend-id="@(context.Variables.GetValueOrDefault<int>("attempt-count") < 2 ? "primary-backend" : "secondary-backend" )" />
           <forward-request />
    </retry>
</backend>

Petunjuk / Saran

Sebagai alternatif, Anda dapat mengonfigurasi sumber daya backend dengan aturan pemutus sirkuit untuk mendeteksi kondisi kegagalan dan kumpulan seimbang beban yang mendistribusikan permintaan di beberapa backend.

Untuk informasi selengkapnya tentang bekerja dengan kebijakan, lihat: