View a markdown version of this page

Perilaku coba lagi - AWS SDK dan Alat

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

Perilaku coba lagi

penting

Perilaku yang dijelaskan di halaman ini memerlukan pilihan hingga menjadi perilaku default. Tetapkan AWS_NEW_RETRIES_2026=true di lingkungan Anda. Tanpa pengaturan ini, SDK Anda menggunakan perilaku percobaan ulang pra-2026, yang berbeda dalam waktu mundur, biaya kuota percobaan ulang, dan default khusus layanan. Untuk detailnya, lihat posting blog pengumuman.

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

Mengkonfigurasi percobaan ulang

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

Memilih mode coba lagi

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

Standar Adaptif Warisan
Kuota coba lagi Ya Ya Bervariasi berdasarkan SDK
Dapat menunda permintaan awal Tidak Ya Tidak
Error-type-specific mundur Ya Ya Bervariasi berdasarkan SDK
Standar di seluruh SDK Ya Ya Tidak
Rekomendasi Default untuk semua beban kerja Single-resource, berat pelambatan, toleran latensi Hanya kompatibilitas mundur

Mode standar (default)

Mode standar mencoba lagi permintaan 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 (sepertiThrottlingException).

Mode standar mencakup kuota percobaan ulang, bucket token yang mengurangi 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 ulang. Selama operasi normal, kuota tetap penuh dan tidak berpengaruh. Kuota percobaan ulang tidak pernah menunda atau memblokir permintaan awal. Hanya percobaan ulang yang terpengaruh. Lihat perinciannya di Kuota coba lagi (bucket token).

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 kecepatan melacak respons pelambatan dan menyesuaikan kecepatan pengiriman permintaan SDK. Tidak seperti mode standar, mode adaptif dapat menunda atau memblokir permintaan awal, bukan hanya percobaan 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 ditargetkan.

Kapan menggunakan mode adaptif:

  • Klien Anda menargetkan satu sumber daya (misalnya, satu tabel DynamoDB) dan Anda mengharapkan respons pelambatan yang sering. Hal ini umum 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. Pembatasan pada satu sumber daya menyebabkan pembatas kecepatan 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.

Modus warisan

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

Mode Legacy bervariasi di seluruh SDK. Jumlah percobaan ulang, waktu mundur, set kesalahan yang dapat dicoba ulang, dan perilaku pembatasan berbeda antar bahasa. Kode yang bergantung pada perilaku coba ulang lama mungkin berperilaku berbeda saat dipindahkan antar SDK.

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

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

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

Setelan coba lagi

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 konfigurasi Default
Modus coba lagi Strategi coba ulang mana yang akan digunakan AWS_RETRY_MODE retry_mode standard
Maksimal upaya Total upaya termasuk permintaan awal AWS_MAX_ATTEMPTS max_attempts 3(lihat catatan)

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

catatan

Klien DynamoDB dan DynamoDB Streams secara default ke maksimum upaya. 4 Layanan ini menggunakan penundaan backoff dasar yang lebih pendek (25 ms, bukan 50 ms) untuk mencocokkan profil latensi rendahnya. 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.

Prioritas konfigurasi

Saat Anda menentukan setelan yang sama di beberapa tempat, SDK menyelesaikan nilai 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. Berkas konfigurasi bersama. K retry_mode max_attempts unci atau masuk~/.aws/config.

  4. SDK default. Default bawaan untuk pengaturan.

Ini mengikuti prioritas konfigurasi AWS SDK standar. Nilai yang ditetapkan pada tingkat yang lebih tinggi selalu mengesampingkan nilai yang ditetapkan pada tingkat yang lebih rendah. Misalnya, jika Anda menyet AWS_RETRY_MODE=adaptive el sebagai variabel lingkungan dan retry_mode=standard masuk~/.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 pengembang SDK Anda untuk opsi konfigurasi khusus bahasa seperti strategi mundur khusus, kesalahan tambahan yang dapat dicoba ulang, dan penyetelan kuota coba lagi.

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 SDK berhenti mencoba lagi.

Apa yang terjadi ketika permintaan gagal

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

  1. Mode adaptifHanya mode adaptif: SDK memeriksa pembatas laju sisi klien. Jika throttling telah terdeteksi, SDK dapat menunda atau memblokir permintaan sebelum mengirimnya.

  2. SDK mengirimkan permintaan ke Layanan AWS titik akhir.

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

  4. Jika permintaan gagal, SDK mengklasifikasikan kesalahan sebagai sementara, throttling, atau tidak dapat dicoba ulang. Lihat Kesalahan mana yang dicoba ulang.

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

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

  7. SDK memeriksaKuota coba lagi (bucket token). Jika anggaran token habis, SDK tidak akan mencoba lagi dan mengembalikan kesalahan ke kode Anda. Pengecualian: untukLong-polling operasi, SDK masih menerapkan penundaan mundur sebelum mengembalikan kesalahan.

  8. SDK menghitung penundaan mundur berdasarkan jenis kesalahan dan nomor percobaan coba lagi. Lihat Berapa lama SDK menunggu.

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

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

Kesalahan mana yang dicoba ulang

SDK mengklasifikasikan setiap permintaan yang gagal menjadi salah satu dari tiga kategori: sementara, throttling, atau tidak dapat dicoba ulang. Klasifikasi ini menentukan apakah SDK mencoba kembali permintaan dan berapa lama menunggu sebelum mencoba lagi.

Klasifikasi didasarkan pada kode kesalahan dan kode status HTTP dalam respons layanan. Misalnya, HTTP 400 dengan kode kesalahan diklasifik RequestTimeout asikan sebagai transien dan dicoba ulang. HTTP 400 dengan diklasifik ValidationException asikan sebagai tidak dapat dicoba ulang dan segera dikembalikan.

Klasifikasi kesalahan

Kesalahan transien dicoba ulang dengan penundaan dasar pendek (50 ms):

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

Kesalahan throttling 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) dikembalikan ke kode Anda segera.

catatan

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

Kesalahan throttling berarti layanan secara aktif menolak permintaan Anda karena batas tarif, sehingga SDK menunggu lebih lama sebelum mencoba lagi untuk 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 ulang menunggu lebih lama dari yang terakhir, dengan pengacakan untuk menyebarkan permintaan dari beberapa klien.

Penundaan dasar berdasarkan jenis kesalahan

Penundaan dasar tergantung pada apakah kesalahannya bersifat sementara atau pelambatan:

Jenis kesalahan Penundaan dasar Alasannya
Transien (non-pelambatan) 50 ms Kesalahan transien biasanya diselesaikan dalam milidetik. Penundaan dasar singkat memberikan pemulihan yang cepat.
Throttling 1.000 ms Layanan ini memiliki permintaan yang membatasi tarif. Penundaan dasar yang lebih lama memberi waktu untuk memulihkan kapasitas.

Rumus Backoff

SDK menghitung setiap penundaan percobaan ulang 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)

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

Contoh yang berhasil

Contoh 1: Kesalahan sementara, 3 upaya maksimal

Langkah Apa yang terjadi Penundaan
Upaya 1 Permintaan awal. Layanan mengembalikan HTTP 503. (tidak ada)
Upaya 2 SDK menunggu secara acak (0, 50 ms). Coba lagi gagal dengan 503. 0—50 ms (rata-rata ~ 25 ms)
Upaya 3 SDK menunggu 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 throttling, 3 upaya maksimal

Langkah Apa yang terjadi Penundaan
Upaya 1 Permintaan awal. Layanan mengembalikan 429Throttling. (tidak ada)
Upaya 2 SDK menunggu secara acak (0, 1.000 ms). Retry mengembalikan 429. 0—1,000 ms (rata-rata ~ 500 ms)
Upaya 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, menekan tutup mundur

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

Coba lagi Penundaan maksimal yang dihitung Setelah 20 detik tutup
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

Batasan 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 max_attempts meningkatkan 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 menyebarkan 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 jendela 50 ms alih-alih mencoba kembali 1.000 kali tepat pada 50 ms.

Server-directed waktu coba lagi

Beberapa Layanan AWS menyertakan x-amz-retry-after header dalam respons kesalahan. Nilai header adalah penundaan dalam milidetik. Ketika 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 itu sendiri dibatasi pada 20 detik, penundaan yang diarahkan server maksimum efektif adalah 25 detik. SDK tidak menerapkan jitter ke nilai ini, karena layanan diharapkan untuk mengguncangnya. Hal ini memungkinkan layanan untuk berkomunikasi tepat ketika diharapkan memiliki kapasitas yang tersedia.

Kuota coba lagi (bucket token)

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 ulang, membantu gangguan layanan diselesaikan lebih cepat.

Cara kerja kuota coba ulang

Anggaran token mulai penuh. Setiap upaya coba lagi mengurangi token. Ketika percobaan ulang berhasil, SDK mengembalikan token yang dikonsumsi oleh percobaan ulang tersebut. Ketika permintaan berhasil pada percobaan pertama (tidak diperlukan percobaan ulang), 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 percobaan ulang sementara (non-throttling) 14 token
Biaya per percobaan ulang pelambatan 5 token
Token dipulihkan saat berhasil setelah dicoba lagi Jumlah yang dikonsumsi oleh percobaan ulang terakhir (14 atau 5)
Token dipulihkan saat berhasil tanpa mencoba lagi 1 token

Biaya yang lebih tinggi untuk percobaan ulang sementara mencerminkan pola kegagalan yang berbeda. Kesalahan sementara seperti 500 detik dan kegagalan koneksi sering menunjukkan masalah di seluruh layanan. Dalam situasi ini, percobaan ulang yang berkelanjutan tidak mungkin berhasil. Ini menambahkan latensi pada panggilan Anda, mengikat sumber daya klien, dan dapat menunda pemulihan untuk semua orang. Kesalahan throttling 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 dicoba lagi

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

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

Dengan default 3 upaya maksimal, kuota mulai habis ketika lebih dari sekitar 22% permintaan mengakibatkan 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 sebesar 500 token menyediakan buffer yang menyerap ledakan kegagalan singkat. Lonjakan kesalahan singkat, bahkan yang parah, tidak memblokir percobaan ulang kecuali bertahan cukup lama untuk menguras buffer.

Implikasi praktis

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

  • Selama gangguan layanan: Jika persentase tinggi dari permintaan Anda gagal untuk jangka waktu yang berkelanjutan, kuota habis dan klien Anda segera mendapatkan kesalahan kembali alih-alih menunggu percobaan ulang. Ini mengurangi latensi sisi klien, membebaskan utas 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 dan keberhasilan percobaan pertama mengembalikan 1 token. Anggaran secara bertahap diisi ulang dan percobaan ulang dilanjutkan secara otomatis.

  • Lingkup: Anggaran token biasanya dicakup ke satu instance klien SDK. Cakupan 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 Standar umum DynamoDB standar
Penundaan dasar transien (non-pelambatan) 50 ms 25 ms
Penundaan dasar pelambatan 1.000 ms 1.000 ms
Maksimal upaya 3 4

Default ini berlaku untuk Amazon DynamoDB dan DynamoDB Streams.

Long-polling operasi

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

  • SQS.ReceiveMessage

  • SFN.GetActivityTask

  • SWF.PollForActivityTask

  • SWF.PollForDecisionTask

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

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

Dukungan 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