View a markdown version of this page

Coba lagi perilaku - AWS SDK dan Alat

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

Coba lagi perilaku

penting

Perilaku yang dijelaskan di halaman ini mengharuskan ikut serta hingga menjadi perilaku default. Ditetapkan AWS_NEW_RETRIES_2026=true di lingkungan Anda. Tanpa pengaturan ini, SDK Anda menggunakan perilaku coba ulang pra-2026, yang berbeda dalam waktu backoff, biaya kuota coba lagi, dan default khusus layanan. Untuk detailnya, lihat posting blog pengumuman.

Ketika permintaan Layanan AWS gagal karena kesalahan sementara atau pembatasan, SDK dapat mencoba ulang permintaan secara otomatis. Halaman ini mencakup cara mengonfigurasi percobaan ulang dan cara kerjanya secara internal.

Mengkonfigurasi percobaan ulang

Anda mengontrol strategi coba ulang mana yang digunakan SDK dan berapa kali mencoba ulang.

Memilih mode coba lagi

Mode coba lagi menentukan bagaimana SDK berperilaku ketika permintaan gagal. Tiga mode tersedia: standar, adaptif, dan warisan.

Standar Adaptif Warisan
Coba lagi kuota Ya Ya Bervariasi menurut SDK
Dapat menunda permintaan awal Tidak Ya Tidak
Error-type-specific backoff Ya Ya Bervariasi menurut SDK
Standar di seluruh SDK Ya Ya Tidak
Rekomendasi Default untuk semua beban kerja Single-resource, melambatan-berat, toleran latensi Kompatibilitas mundur saja

Mode standar (default)

Mode standar mencoba ulang permintaan yang gagal menggunakan backoff eksponensial dengan jitter. Ini menggunakan penundaan yang lebih pendek untuk kesalahan sementara (seperti batas waktu jaringan) dan penundaan yang lebih lama untuk kesalahan pelambatan (seperti). ThrottlingException

Mode standar mencakup kuota coba lagi, ember token yang memotong token untuk setiap percobaan ulang dan mengisi kembali token saat permintaan berhasil. Ketika token yang tersedia habis, SDK mengembalikan kesalahan tanpa mencoba lagi, sehingga aplikasi Anda gagal dengan cepat alih-alih menunggu percobaan ulang yang tidak mungkin berhasil. Ini juga membantu gangguan layanan diselesaikan lebih cepat dengan mengurangi lalu lintas coba lagi. Selama operasi normal, kuota tetap penuh dan tidak berpengaruh. Kuota coba lagi tidak pernah menunda atau memblokir permintaan awal. Hanya percobaan ulang yang terpengaruh. Lihat perinciannya di Coba lagi kuota (token bucket).

Gunakan mode standar kecuali Anda memiliki alasan khusus untuk memilih mode lain.

Mode adaptif

Mode adaptif mencakup semuanya dalam mode standar, ditambah pembatas laju sisi klien. Pembatas laju melacak respons pelambatan dan menyesuaikan kecepatan pengiriman permintaan SDK. Tidak seperti mode standar, mode adaptif dapat menunda atau memblokir permintaan awal, bukan hanya mencoba ulang, ketika pelambatan terdeteksi.

Pembatas tarif beroperasi per instance klien SDK. Semua permintaan dari klien memiliki batas tarif yang sama, terlepas dari operasi API atau sumber daya yang mereka targetkan.

Kapan menggunakan mode adaptif:

  • Klien Anda menargetkan satu sumber daya (misalnya, satu tabel DynamoDB) dan Anda mengharapkan respons pelambatan yang sering. Ini biasa terjadi pada alur kerja otomatis, prosesor batch, atau beban kerja AI yang memanggil operasi API tunggal pada volume tinggi.

  • Anda ingin SDK melambat secara otomatis saat layanan memberi sinyal pelambatan.

Kapan tidak menggunakan mode adaptif:

  • Klien Anda mengirimkan permintaan ke beberapa sumber daya atau melayani beberapa penyewa. Pelambatan pada satu sumber daya menyebabkan pembatas laju memperlambat semua permintaan dari klien tersebut, termasuk permintaan ke sumber daya yang tidak terpengaruh.

  • Anda memerlukan latensi yang dapat diprediksi pada permintaan awal.

Mode adaptif tidak disarankan sebagai default umum.

Mode warisan

Mode lama adalah perilaku coba ulang setiap SDK yang digunakan sebelum mode standar diperkenalkan. Ini tidak termasuk kuota coba lagi standar. Beberapa SDK (seperti Java) memiliki implementasi kuota coba ulang sendiri dalam mode lama, tetapi perilakunya tidak konsisten di seluruh SDK. Tanpa kuota standar, klien terus mencoba lagi dengan kecepatan penuh selama gangguan layanan. Ini mengikat utas dan koneksi pada permintaan yang tidak mungkin berhasil, sambil menambahkan beban yang dapat menunda pemulihan layanan.

Mode lama bervariasi di seluruh SDK. Hitungan coba lagi, waktu backoff, set kesalahan yang dapat dicoba ulang, dan perilaku pelambatan berbeda antar bahasa. Kode yang bergantung pada perilaku coba lagi lama dapat berperilaku berbeda saat dipindahkan antar SDK.

Tersedia dalam: Java, Python, Ruby, PHP, C++, CLI

Tidak tersedia di: .NET, Go, Kotlin, Rust, Swift, JavaScript

Mode lama ada untuk kompatibilitas mundur. Jika saat ini Anda menggunakan mode lama, beralihlah ke mode standar.

Coba lagi pengaturan

Pengaturan berikut mengontrol perilaku coba lagi. Anda dapat mengaturnya melalui variabel lingkungan, file konfigurasi bersama (~/.aws/config), atau konfigurasi klien dalam kode.

Pengaturan Apa yang dikendalikannya Variabel lingkungan Kunci file Config Default
Mode coba lagi Strategi coba lagi mana yang akan digunakan AWS_RETRY_MODE retry_mode standard
Upaya maks Total upaya termasuk permintaan awal AWS_MAX_ATTEMPTS max_attempts 3(lihat catatan)

Nilai percobaan maksimal 3 berarti SDK membuat satu permintaan awal dan hingga dua percobaan ulang. Setel upaya maksimal 1 untuk menonaktifkan percobaan ulang sepenuhnya.

catatan

Klien DynamoDB dan DynamoDB Streams default ke upaya maksimal. 4 Layanan ini menggunakan penundaan backoff dasar yang lebih pendek (25 ms, bukan 50 ms) untuk mencocokkan profil latensi rendah mereka. Upaya tambahan membuat backoff maksimum percobaan ulang terakhir sebanding dengan layanan lain. Anda dapat mengganti ini dengan pengaturan yang sama seperti yang ditunjukkan pada tabel sebelumnya.

Konfigurasi diutamakan

Saat Anda menentukan setelan yang sama di beberapa tempat, SDK akan menyelesaikan nilainya menggunakan prioritas berikut, dari tertinggi ke terendah:

  1. Konfigurasi klien eksplisit dalam kode. Nilai yang ditetapkan langsung pada klien SDK atau objek konfigurasinya.

  2. Variabel lingkungan. Misalnya, AWS_RETRY_MODE atau AWS_MAX_ATTEMPTS.

  3. File konfigurasi bersama. max_attemptsKunci retry_mode atau masuk~/.aws/config.

  4. SDK default. Default bawaan untuk pengaturan.

Ini mengikuti prioritas konfigurasi AWS SDK standar. Nilai yang ditetapkan pada level yang lebih tinggi selalu mengesampingkan nilai yang ditetapkan pada level yang lebih rendah. Misalnya, jika Anda menetapkan AWS_RETRY_MODE=adaptive sebagai variabel lingkungan dan retry_mode=standard dalam~/.aws/config, SDK menggunakan mode adaptif.

Language-specific konfigurasi

Pengaturan lintas SDK yang dijelaskan di halaman ini (retry_modedanmax_attempts) berfungsi di semua SDK. Namun, API untuk mengonfigurasi percobaan ulang dalam kode bervariasi menurut bahasa. Lihat panduan developer SDK Anda untuk opsi konfigurasi khusus bahasa seperti strategi backoff khusus, kesalahan tambahan yang dapat dicoba ulang, dan coba lagi penyetelan kuota.

Cara kerja percobaan ulang

Bagian ini menjelaskan cara AWS SDK menangani permintaan yang gagal: kesalahan mana yang memicu percobaan ulang, berapa lama SDK menunggu di antara upaya, dan kapan berhenti mencoba lagi.

Apa yang terjadi ketika permintaan gagal

Saat Anda melakukan panggilan API melalui AWS SDK, SDK mengikuti urutan ini:

  1. Hanya mode adaptif: SDK memeriksa pembatas laju sisi klien. Jika pelambatan terdeteksi, SDK dapat menunda atau memblokir permintaan sebelum mengirimnya.

  2. SDK mengirimkan permintaan ke titik Layanan AWS akhir.

  3. Jika layanan mengembalikan respons yang berhasil, SDK mengembalikan hasilnya ke kode Anda.

  4. Jika permintaan gagal, SDK mengklasifikasikan error sebagai transient, throttling, atau non-retryable. Lihat Kesalahan mana yang dicoba lagi.

  5. Jika kesalahan tidak dapat dicoba ulang, SDK segera mengembalikan kesalahan ke kode Anda. Tidak ada percobaan lagi yang dicoba.

  6. Jika kesalahan dapat dicoba ulang, SDK memeriksa apakah telah mencapai jumlah upaya maksimum. Jika demikian, ia mengembalikan kesalahan ke kode Anda.

  7. SDK memeriksa file. Coba lagi kuota (token bucket) Jika anggaran token habis, SDK tidak mencoba lagi dan mengembalikan kesalahan ke kode Anda. Pengecualian: untukLong-polling operasi, SDK masih menerapkan penundaan backoff sebelum mengembalikan kesalahan.

  8. SDK menghitung penundaan backoff berdasarkan jenis kesalahan dan nomor percobaan ulang. Lihat Berapa lama SDK menunggu.

  9. SDK menunggu penundaan yang dihitung, lalu mengirimkan permintaan lagi dari langkah 2.

SDK mengulangi loop ini hingga permintaan berhasil, jumlah upaya maksimum tercapai, kuota coba lagi habis, atau terjadi kesalahan yang tidak dapat dicoba ulang. Seluruh proses otomatis. Aplikasi Anda melihat respons yang berhasil atau kesalahan terakhir.

Kesalahan mana yang dicoba lagi

SDK mengklasifikasikan setiap permintaan yang gagal ke dalam salah satu dari tiga kategori: transient, throttling, atau non-retryable. Klasifikasi ini menentukan apakah SDK mencoba ulang permintaan dan berapa lama menunggu sebelum mencoba lagi.

Klasifikasi didasarkan pada kode kesalahan dan kode status HTTP dalam respon layanan. Misalnya, HTTP 400 dengan kode kesalahan RequestTimeout diklasifikasikan sebagai sementara dan dicoba lagi. HTTP 400 dengan ValidationException diklasifikasikan sebagai non-retryable dan segera dikembalikan.

Klasifikasi kesalahan

Kesalahan sementara dicoba lagi dengan penundaan dasar pendek (50 ms):

Kode kesalahan
RequestTimeout
RequestTimeoutException
InternalError
IDPCommunicationError
I/O Kegagalan (Reset koneksi, kegagalan resolusi DNS, batas waktu soket)
(HTTP 500, 502, 503, atau 504 tanpa kode kesalahan yang diakui)

Kesalahan pelambatan dicoba lagi dengan penundaan dasar yang lebih lama (1.000 ms):

Kode kesalahan
Throttling
ThrottlingException
ThrottledException
RequestThrottledException
TooManyRequestsException
ProvisionedThroughputExceededException
TransactionInProgressException
LimitExceededException
PriorRequestNotComplete
RequestThrottled
EC2ThrottledException
RequestLimitExceeded
SlowDown
BandwidthLimitExceeded

Non-retryable kesalahan (sepertiAccessDeniedException,ValidationException,ResourceNotFoundException) segera dikembalikan ke kode Anda.

catatan

HTTP 5XX dengan kode kesalahan pelambatan diklasifikasikan sebagai kesalahan pelambatan, bukan kesalahan sementara, meskipun kesalahan 5XX biasanya bersifat sementara. SDK cocok dengan kode kesalahan terlebih dahulu, lalu kembali ke kode status HTTP.

Kesalahan pelambatan berarti layanan secara aktif menolak permintaan Anda karena batas tarif, sehingga SDK menunggu lebih lama sebelum mencoba lagi memberikan waktu layanan untuk memulihkan kapasitas. Lihat Berapa lama SDK menunggu untuk penundaan spesifik.

Berapa lama SDK menunggu

SDK menggunakan backoff eksponensial dengan jitter penuh. Rata-rata, setiap percobaan lagi menunggu lebih lama dari yang terakhir, dengan pengacakan untuk menyebarkan permintaan dari beberapa klien.

Penundaan dasar berdasarkan jenis kesalahan

Penundaan dasar tergantung pada apakah kesalahan bersifat sementara atau pelambatan:

Jenis kesalahan Penundaan dasar Dasar Pemikiran
Transien (non-throttling) 50 ms Kesalahan transien biasanya hilang dalam milidetik. Penundaan dasar yang singkat memberikan pemulihan yang cepat.
Throttling 1.000 ms Layanan ini memiliki tingkat permintaan yang terbatas. Penundaan dasar yang lebih lama memberi waktu untuk memulihkan kapasitas.

Rumus backoff

SDK menghitung setiap penundaan coba lagi menggunakan rumus ini:

delay = random(0, 1) × min(20,000 ms, base_delay × 2^retry)

Di mana:

  • random(0, 1)mengembalikan nilai terdistribusi seragam antara 0 dan 1

  • base_delayadalah 50 ms untuk kesalahan sementara atau 1.000 ms untuk kesalahan pelambatan

  • retrydimulai pada 0 untuk percobaan ulang pertama (upaya permintaan keseluruhan kedua)

Tutup backoff maksimum adalah 20 detik. Tidak ada penundaan individu yang melebihi 20 detik terlepas dari berapa banyak upaya yang telah terjadi.

Contoh yang dikerjakan

Contoh 1: Kesalahan sementara, 3 upaya maksimal

Langkah Apa yang terjadi Keterlambatan
Mencoba 1 Permintaan awal. Layanan mengembalikan HTTP 503. (tidak ada)
Mencoba 2 SDK menunggu secara acak (0, 50 ms). Coba lagi gagal dengan 503. 0—50 ms (rata-rata ~ 25 ms)
Mencoba 3 SDK menunggu secara acak (0, 100 ms). Coba lagi berhasil. 0—100 ms (rata-rata ~ 50 ms)

Total latensi tambahan rata-rata sekitar 75 ms di kedua percobaan ulang.

Contoh 2: Kesalahan pelambatan, 3 upaya maksimal

Langkah Apa yang terjadi Keterlambatan
Mencoba 1 Permintaan awal. Pengembalian layanan 429Throttling. (tidak ada)
Mencoba 2 SDK menunggu secara acak (0, 1.000 ms). Coba lagi mengembalikan 429. 0—1.000 ms (rata-rata ~ 500 ms)
Mencoba 3 SDK menunggu secara acak (0, 2.000 ms). Coba lagi berhasil. 0—2.000 ms (rata-rata ~ 1.000 ms)

Total latensi tambahan rata-rata sekitar 1.500 ms di kedua percobaan ulang.

Contoh 3: Kesalahan sementara, mengenai tutup backoff

Dengan penundaan dasar 50 ms, penundaan yang dihitung sebelum pembatasan adalah:

Coba lagi Penundaan maks yang dihitung Setelah tutup 20 detik
1 50 ms 50 ms
2 100 ms 100 ms
5 800 ms 800 ms
9 12,800 ms 12,800 ms
10 25.600 ms 20.000 ms

Tutup mulai berlaku pada percobaan ulang ke-10 (upaya ke-11) untuk kesalahan sementara. Untuk kesalahan pelambatan dengan basis 1.000 ms, tutup berlaku pada percobaan ulang ke-6.

catatan

Dengan default 3 upaya maksimal (1 permintaan awal+2 percobaan ulang), batas backoff tidak pernah tercapai. Tabel ini menggambarkan apa yang terjadi jika Anda meningkat max_attempts jauh melampaui default.

Mengapa jitter penting

Pengganda acak disebut jitter penuh. Tanpa itu, semua klien yang mengalami kesalahan pada saat yang sama akan mencoba lagi pada saat yang sama, menciptakan ledakan lalu lintas coba lagi (masalah “kawanan gemuruh”). Jitter penuh menyebar percobaan ulang secara seragam di seluruh jendela backoff sehingga layanan menerima tetesan permintaan yang stabil alih-alih lonjakan yang disinkronkan.

Misalnya, 1.000 klien semuanya menerima 503 pada saat yang sama. Jitter penuh mendistribusikan percobaan ulang pertama mereka secara seragam di seluruh jendela 50 ms alih-alih memiliki semua 1.000 percobaan lagi tepat 50 ms.

Server-directed coba lagi waktu

Beberapa Layanan AWS menyertakan x-amz-retry-after header dalam respons kesalahan. Nilai header adalah penundaan dalam milidetik. Saat header ini ada, SDK menggunakan penundaan yang ditentukan server, dijepit ke minimum penundaan backoff yang dihitung dan maksimum penundaan backoff yang dihitung ditambah 5.000 ms. Karena backoff yang dihitung sendiri dibatasi pada 20 detik, penundaan diarahkan server maksimum yang efektif adalah 25 detik. SDK tidak menerapkan jitter ke nilai ini, karena layanan diharapkan akan menggetarkannya. Hal ini memungkinkan layanan untuk berkomunikasi tepat ketika mengharapkan untuk memiliki kapasitas yang tersedia.

Coba lagi kuota (token bucket)

SDK mempertahankan anggaran token internal yang melacak rasio permintaan yang berhasil terhadap kegagalan. Ketika kegagalan tersebar luas, anggaran habis dan SDK mengembalikan kesalahan secara langsung. Aplikasi Anda gagal dengan cepat alih-alih menunggu percobaan ulang yang tidak mungkin berhasil. Ini juga mengurangi lalu lintas coba lagi, membantu gangguan layanan diselesaikan lebih cepat.

Cara kerja kuota coba lagi

Anggaran token mulai penuh. Setiap upaya coba lagi mengurangi token. Ketika percobaan ulang berhasil, SDK mengembalikan token yang dikonsumsi oleh percobaan ulang itu. Ketika permintaan berhasil pada percobaan pertama (tidak perlu mencoba lagi), SDK mengembalikan 1 token. Ketika anggaran mencapai nol, SDK berhenti mencoba lagi dan mengembalikan kesalahan langsung ke kode Anda.

Parameter Nilai
Kapasitas anggaran 500 token
Biaya per transien (non-throttling) coba lagi 14 token
Biaya per throttling coba lagi 5 token
Token dipulihkan pada keberhasilan setelah mencoba lagi Jumlah yang dikonsumsi oleh percobaan ulang terakhir (14 atau 5)
Token dipulihkan pada keberhasilan tanpa mencoba lagi 1 token

Biaya yang lebih tinggi untuk percobaan ulang sementara mencerminkan pola kegagalannya yang berbeda. Kesalahan sementara seperti 500s dan kegagalan koneksi sering menunjukkan masalah di seluruh layanan. Dalam situasi ini, terus mencoba lagi tidak mungkin berhasil. Ini menambahkan latensi ke panggilan Anda, mengikat sumber daya klien, dan dapat menunda pemulihan untuk semua orang. Kesalahan pelambatan menandakan bahwa layanan membutuhkan lebih banyak waktu sebelum permintaan dapat berhasil. SDK menunggu lebih lama di antara percobaan ulang untuk meningkatkan kemungkinan keberhasilan.

Kapan blok kuota mencoba lagi

Kuota coba lagi melacak token setiap saat, tetapi hanya memblokir percobaan ulang ketika anggaran habis. Selama operasi normal, hampir semua permintaan berhasil dan anggaran tetap penuh. Kuota tidak memiliki efek yang dapat diamati pada percobaan ulang.

Percobaan ulang yang berhasil hanya mengembalikan biaya tokennya sendiri (14 atau 5 token), bukan biaya percobaan ulang yang gagal sebelumnya dalam permintaan yang sama. Misalnya, jika percobaan ulang pertama gagal dan yang kedua berhasil, anggaran kehilangan 14 token bersih. Anggaran terkuras paling cepat ketika mencoba ulang menghabiskan semua upaya tanpa berhasil, tetapi juga mengalir secara bertahap ketika permintaan membutuhkan beberapa percobaan ulang sebelum berhasil.

Dengan default 3 upaya maksimal, kuota mulai terkuras ketika lebih dari sekitar 22% permintaan menghasilkan kegagalan sementara yang berkelanjutan, atau lebih dari sekitar 32% untuk kesalahan pelambatan. Di bawah tarif ini, permintaan yang berhasil mengisi kembali anggaran lebih cepat daripada percobaan ulang yang gagal mengurasnya.

Saldo awal anggaran 500 token menyediakan buffer yang menyerap ledakan kegagalan singkat. Lonjakan singkat dalam kesalahan, bahkan yang parah, tidak menghalangi percobaan ulang kecuali bertahan cukup lama untuk mengeringkan buffer.

Implikasi praktis

  • Tingkat kegagalan rendah: Kuota tidak berpengaruh. Anggaran tetap pada atau mendekati kapasitas.

  • Selama gangguan layanan: Jika persentase permintaan Anda yang tinggi gagal untuk jangka waktu yang berkelanjutan, kuota akan habis dan klien Anda segera mendapatkan kesalahan kembali alih-alih menunggu melalui percobaan ulang. Ini mengurangi latensi sisi klien, membebaskan thread dan koneksi, dan membantu layanan pulih lebih cepat.

  • Pemulihan: Saat layanan pulih dan permintaan mulai berhasil lagi, percobaan ulang yang berhasil mengembalikan biaya token penuh mereka dan keberhasilan percobaan pertama mengembalikan 1 token. Anggaran secara bertahap mengisi ulang dan mencoba ulang dilanjutkan secara otomatis.

  • Lingkup: Anggaran token biasanya dicakup ke satu instance klien SDK. Ruang lingkup yang tepat dapat bervariasi menurut SDK. Itu tidak dibagikan di seluruh proses atau host.

Service-specific perilaku

DynamoDB

Klien DynamoDB menggunakan default yang disetel yang dioptimalkan untuk profil latensi rendah DynamoDB:

Pengaturan Default umum DynamoDB standar
Penundaan dasar sementara (non-throttling) 50 ms 25 ms
Penundaan dasar pelambatan 1.000 ms 1.000 ms
Upaya maks 3 4

Default ini berlaku untuk Amazon DynamoDB dan DynamoDB Streams.

Long-polling operasi

AWS Operasi tertentu menggunakan polling panjang. Mereka dapat mengadakan koneksi terbuka menunggu pekerjaan tiba. Operasi ini menerima perlakuan coba ulang khusus:

  • SQS.ReceiveMessage

  • SFN.GetActivityTask

  • SWF.PollForActivityTask

  • SWF.PollForDecisionTask

Perilaku khusus: Ketika kuota coba lagi habis dan percobaan ulang diblokir (langkah 7 inApa yang terjadi ketika permintaan gagal), SDK masih menerapkan penundaan backoff sebelum mengembalikan kesalahan ke kode Anda.

Ini penting karena operasi pemungutan suara panjang biasanya disebut dalam lingkaran ketat. Kode Anda memanggilReceiveMessage, memproses pesan apa pun, lalu segera menelepon ReceiveMessage lagi. Tanpa backoff paksa, anggaran token yang habis akan menyebabkan SDK mengembalikan kesalahan tanpa penundaan. Loop polling Anda kemudian akan segera mengirim permintaan berikutnya, meningkatkan penggunaan CPU klien dan menghasilkan lalu lintas tambahan. Penundaan backoff paksa memutus siklus ini, menjaga penggunaan sumber daya klien dan tingkat polling dapat dikelola selama kegagalan.

Support oleh AWS SDK dan alat

Tabel berikut mencantumkan ketersediaan perilaku coba ulang yang diperbarui di setiap SDK. Untuk SDK-specific detail termasuk versi minimum, default sebelum dan sesudah, dan contoh kode, lihat masalah pelacakan. GitHub