Coba lagi perilaku - AWS SDKsdan Alat

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Coba lagi perilaku

Perilaku coba lagi mencakup pengaturan mengenai bagaimana SDKs upaya untuk memulihkan dari kegagalan yang dihasilkan dari permintaan yang dibuat Layanan AWS.

Konfigurasikan fungsi ini dengan menggunakan yang berikut ini:

retry_mode- dibagikan AWS configpengaturan file
AWS_RETRY_MODE- variabel lingkungan
aws.retryMode- properti JVM sistem: Hanya Java/Kotlin

Menentukan bagaimana SDK atau alat pengembang mencoba mencoba ulang.

Nilai default: Nilai ini khusus untuk AndaSDK. Periksa SDK panduan spesifik Anda atau basis kode Anda SDK untuk defaultnyaretry_mode.

Nilai yang valid:

  • standard— (Disarankan) Seperangkat aturan coba lagi yang direkomendasikan di seluruh AWS SDKs. Mode ini mencakup serangkaian kesalahan standar yang dicoba ulang, dan secara otomatis menyesuaikan jumlah percobaan ulang untuk memaksimalkan ketersediaan dan stabilitas. Mode ini aman untuk digunakan dalam aplikasi multi-tenant. Jumlah maksimum percobaan default dengan mode ini adalah tiga, kecuali max_attempts dikonfigurasi secara eksplisit.

  • adaptive— Mode coba lagi, hanya sesuai untuk kasus penggunaan khusus, yang mencakup fungsionalitas mode standar serta pembatasan laju sisi klien otomatis. Mode coba lagi ini tidak disarankan untuk aplikasi multi-penyewa, kecuali jika Anda berhati-hati untuk mengisolasi penyewa aplikasi. Untuk informasi selengkapnya, lihat Memilih antara standard dan adaptive coba lagi mode. Mode ini bersifat eksperimental dan mungkin mengubah perilaku di masa depan.

  • legacy— (Tidak Disarankan) Khusus untuk Anda SDK (periksa SDK panduan spesifik Anda SDK atau basis kode Anda).

max_attempts- dibagikan AWS configpengaturan file
AWS_MAX_ATTEMPTS- variabel lingkungan
aws.maxAttempts- properti JVM sistem: Hanya Java/Kotlin

Menentukan jumlah maksimum upaya untuk membuat atas permintaan.

Nilai default: Jika nilai ini tidak ditentukan, defaultnya tergantung pada nilai retry_mode pengaturan:

  • Jika retry_mode ya legacy — Menggunakan nilai default khusus untuk Anda SDK (periksa SDK panduan spesifik Anda SDK atau basis kode Anda untuk max_attempts default).

  • Jika retry_mode ada standard — Membuat tiga upaya.

  • Jika retry_mode ada adaptive — Membuat tiga upaya.

Nilai yang valid: Angka lebih besar dari 0.

Memilih antara standard dan adaptive coba lagi mode

Kami menyarankan Anda menggunakan mode standard coba lagi kecuali Anda yakin bahwa penggunaan Anda lebih cocok untukadaptive.

catatan

adaptiveMode mengasumsikan bahwa Anda mengumpulkan klien berdasarkan ruang lingkup di mana layanan backend dapat membatasi permintaan. Jika Anda tidak melakukan ini, pembatasan dalam satu sumber daya dapat menunda permintaan untuk sumber daya yang tidak terkait jika Anda menggunakan klien yang sama untuk kedua sumber daya.

Standar Adaptif
Kasus penggunaan aplikasi: Semua. Kasus penggunaan aplikasi:
  1. Tidak sensitif terhadap latensi.

  2. Klien hanya mengakses satu sumber daya, atau, Anda menyediakan logika untuk mengumpulkan klien Anda secara terpisah oleh sumber daya layanan yang sedang diakses.

Mendukung pemutusan sirkuit untuk mencegah mencoba lagi selama SDK pemadaman. Mendukung pemutusan sirkuit untuk mencegah mencoba lagi selama SDK pemadaman.
Menggunakan backoff eksponensial gelisah jika terjadi kegagalan. Menggunakan durasi backoff dinamis untuk mencoba meminimalkan jumlah permintaan yang gagal, dengan imbalan potensi peningkatan latensi.
Jangan pernah menunda upaya permintaan pertama, hanya percobaan ulang. Dapat membatasi atau menunda upaya permintaan awal.

Jika Anda memilih untuk menggunakan adaptive mode, aplikasi Anda harus membangun klien yang dirancang di sekitar setiap sumber daya yang mungkin dibatasi. Sumber daya, dalam hal ini, disetel lebih baik daripada hanya memikirkan masing-masing Layanan AWS. Layanan AWS dapat memiliki dimensi tambahan yang mereka gunakan untuk membatasi permintaan. Mari kita gunakan layanan Amazon DynamoDB sebagai contoh. DynamoDB menggunakan Wilayah AWS ditambah tabel yang diakses ke permintaan throttle. Ini berarti bahwa satu tabel yang diakses kode Anda mungkin dibatasi lebih dari yang lain. Jika kode Anda menggunakan klien yang sama untuk mengakses semua tabel, dan permintaan ke salah satu tabel tersebut dibatasi, maka mode coba lagi adaptif akan mengurangi tingkat permintaan untuk semua tabel. Kode Anda harus dirancang untuk memiliki satu klien per egion-and-table pasangan R. Jika Anda mengalami latensi tak terduga saat menggunakan adaptive mode, lihat spesifiknya AWS panduan dokumentasi untuk layanan yang Anda gunakan.

Coba lagi detail implementasi mode

Bagian AWS SDKsgunakan ember token untuk memutuskan apakah permintaan harus dicoba lagi dan (dalam kasus mode adaptive coba lagi) seberapa cepat permintaan harus dikirim. Dua bucket token digunakan olehSDK: ember token coba lagi dan bucket token rate permintaan.

  • Bucket token coba lagi digunakan untuk menentukan apakah SDK harus menonaktifkan percobaan ulang sementara untuk melindungi layanan hulu dan hilir selama pemadaman. Token diperoleh dari bucket sebelum percobaan ulang dicoba, dan token dikembalikan ke bucket saat permintaan berhasil. Jika bucket kosong saat percobaan ulang dicoba, permintaan tidak SDK akan mencoba lagi.

  • Bucket token rate permintaan hanya digunakan dalam mode adaptive coba lagi untuk menentukan tingkat pengiriman permintaan. Token diperoleh dari bucket sebelum permintaan dikirim, dan token dikembalikan ke bucket pada tingkat yang ditentukan secara dinamis berdasarkan respons pelambatan yang dikembalikan oleh layanan.

Berikut ini adalah pseudocode tingkat tinggi untuk mode standard dan adaptive coba lagi:

MakeSDKRequest() { attempts = 0 loop { GetSendToken() response = SendHTTPRequest() RequestBookkeeping(response) if not Retryable(response) return response attempts += 1 if attempts >= MAX_ATTEMPTS: return response if not HasRetryQuota(response) return response delay = ExponentialBackoff(attempts) sleep(delay) } }

Berikut ini adalah rincian lebih lanjut tentang komponen yang digunakan dalam pseudocode:

GetSendToken:

Langkah ini hanya digunakan dalam mode adaptive coba lagi. Langkah ini memperoleh token dari bucket token rate permintaan. Jika token tidak tersedia, itu akan menunggu hingga tersedia. Anda SDK mungkin memiliki opsi konfigurasi yang tersedia untuk gagal permintaan alih-alih menunggu. Token dalam bucket diisi ulang pada tingkat yang ditentukan secara dinamis, berdasarkan jumlah respons pelambatan yang diterima oleh klien.

SendHTTPRequest:

Langkah ini mengirimkan permintaan ke AWS. Kebanyakan AWS SDKsgunakan HTTP pustaka yang menggunakan kumpulan koneksi untuk menggunakan kembali koneksi yang ada saat membuat HTTP permintaan. Umumnya, koneksi digunakan kembali jika permintaan gagal karena kesalahan pelambatan tetapi tidak jika permintaan gagal karena kesalahan sementara.

RequestBookkeeping:

Token ditambahkan ke ember token jika permintaan berhasil. Hanya untuk mode adaptive coba lagi, tingkat pengisian bucket token rate permintaan diperbarui berdasarkan jenis respons yang diterima.

Retryable:

Langkah ini menentukan apakah respons dapat dicoba ulang berdasarkan hal berikut:

  • Kode HTTP status.

  • Kode kesalahan dikembalikan dari layanan.

  • Kesalahan koneksi, didefinisikan sebagai kesalahan yang diterima oleh SDK di mana HTTP respons dari layanan tidak diterima.

Kesalahan sementara (kode HTTP status 400, 408, 500, 502, 503, dan 504) dan kesalahan pelambatan (kode HTTP status 400, 403, 429, 502, 503, dan 509) semuanya berpotensi dicoba ulang. SDKperilaku coba lagi ditentukan dalam kombinasi dengan kode kesalahan atau data lain dari layanan.

MAX_ATTEMPTS:

Jumlah default upaya maksimum diatur oleh retry_mode pengaturan, kecuali diganti oleh pengaturan. max_attempts

HasRetryQuota

Langkah ini memperoleh token dari ember token coba lagi. Jika ember token coba lagi kosong, permintaan tidak akan dicoba lagi.

ExponentialBackoff

Untuk kesalahan yang dapat dicoba lagi, penundaan coba lagi dihitung menggunakan backoff eksponensial terpotong. SDKsPenggunaan backoff eksponensial biner terpotong dengan jitter. Algoritma berikut menunjukkan bagaimana jumlah waktu tidur, dalam detik, didefinisikan untuk respons permintaani:

seconds_to_sleep_i = min(b*r^i, MAX_BACKOFF)

Dalam algoritma sebelumnya, nilai-nilai berikut berlaku:

b = random number within the range of: 0 <= b <= 1

r = 2

MAX_BACKOFF = 20 secondsuntuk sebagian besarSDKs. Lihat SDK panduan atau kode sumber khusus Anda untuk konfirmasi.

Kompatibilitas dengan AWS SDKs

Berikut ini SDKs mendukung fitur dan pengaturan yang dijelaskan dalam topik ini. Setiap pengecualian sebagian dicatat. Pengaturan properti JVM sistem apa pun didukung oleh AWS SDK for Java dan AWS SDK for Kotlin hanya.

SDK Didukung Catatan atau informasi lebih lanjut
AWS CLI v2 Ya
SDKuntuk C ++ Ya
SDKuntuk Go V2 (1.x) Ya
SDKuntuk Go 1.x (V1) Tidak
SDKuntuk Java 2.x Ya
SDKuntuk Java 1.x Ya JVMproperti sistem: gunakan com.amazonaws.sdk.maxAttempts sebagai penggantiaws.maxAttempts; gunakan com.amazonaws.sdk.retryMode sebagai penggantiaws.retryMode.
SDKuntuk JavaScript 3.x Ya
SDKuntuk JavaScript 2.x Tidak Mendukung jumlah percobaan ulang maksimum, backoff eksponensial dengan jitter, dan opsi untuk metode khusus untuk coba lagi backoff.
SDKuntuk Kotlin Ya
SDKuntuk. NET3.x Ya
SDKuntuk PHP 3.x Ya
SDKuntuk Python (Boto3) Ya
SDKuntuk Ruby 3.x Ya
SDKuntuk Rust Ya
SDKuntuk Swift Ya
Alat untuk PowerShell Ya